LEVEL 9 ・ API / Lesson 23
JSONを読み書きする
APIの返事の形、JSON。辞書とリストにそっくりな形を、Pythonで読み書きします。
このレッスンが終わったら
「JSONは、辞書とリストにそっくりな、文字だけのデータの書き方。json.load でPythonのデータにできる」と言える。
できることを見る
システム同士がデータをやり取りするとき、いちばんよく使われる書き方が、JSON(ジェイソン)です。見た目は、Lesson 08 で学んだ辞書とリストに、そっくりです。
ここに、社員3人の情報を、JSONで書いた employees.json があります。
{
"count": 3,
"employees": [
{
"id": 1,
"name": "田中",
"department": "営業",
"skills": [
"Excel",
"提案資料"
]
},
{
"id": 2,
"name": "佐藤",
"department": "経理",
"skills": [
"Excel",
"会計ソフト",
"Python"
]
},
{
"id": 3,
"name": "鈴木",
"department": "人事",
"skills": [
"労務"
]
}
]
}
これを、Pythonで読み込んでみます。
import json
with open("employees.json", encoding="utf-8") as f:
data = json.load(f)
print(data["count"])
print(data["employees"][0]["name"])動かしてみる
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
3 と 田中 が表示されました。JSONのファイルが、Pythonの辞書とリストとして読み込まれたのです。
1行ずつ読む
import jsonJSONを扱うための便利機能セット(ライブラリ)を使うwith open("employees.json", encoding="utf-8") as f:employees.json を開いて、「f」と呼ぶ data = json.load(f)fの中身(JSON)を、Pythonのデータに変換して、「data」と呼ぶprint(data["count"])dataの、「count」の中身(3)を表示するprint(data["employees"][0]["name"])「employees」のリストの、0番目の人の、「name」を表示する日本語にすると
最後の行は、箱の中の箱を、順番に開けているイメージです。
- data全体(辞書)
- ["employees"]社員のリスト
- [0]最初の1人(辞書)
- ["name"]名前(田中)
JSONと、Pythonのデータは、次のように対応しています。
| JSON | Python |
|---|---|
{ "name": "田中" }(オブジェクト) | 辞書 |
[ 1, 2, 3 ](配列) | リスト |
"田中" | 文字列 |
120000 | 数字 |
true / false | True / False |
null | None(何もない) |
1か所だけ変える
① 全員を、順番に表示する。 リストの中身を、for で1人ずつ取り出します。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
② 文字列のJSONを、Pythonのデータにする。 ファイルだけでなく、「JSONの文字」そのものも、変換できます。このとき使うのは、load ではなく loads(s = string = 文字列)です。
▶ 実行を押すと、ここに結果が出ます
③ Pythonのデータを、JSONの文字にする。 逆の変換は、dumps です。indent=2 は、見やすく字下げする指定、ensure_ascii=False は、日本語をそのまま出す指定です。
▶ 実行を押すと、ここに結果が出ます
True が、JSONでは小文字の true になっていることに注目してください。
④ ファイルに保存する。 dump(ファイルに書く)を使います。
▶ 実行を押すと、ここに結果が出ます
⑤ JSONの書き方を間違えると? JSONでは、文字を囲むのは、ダブルクォート(")だけです。シングルクォート(')だと、エラーになります。
▶ 実行を押すと、ここに結果が出ます
JSONDecodeError: Expecting property name enclosed in double quotes(見出しは、ダブルクォートで囲んでください)と出ます。JSONのルールに合っていない、という意味です。
自分で書く
お題① employees.json を読み込んで、佐藤さんのスキルの数を表示してください。(佐藤さんは、リストの1番目です)
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
data["employees"][1]["skills"] が、佐藤さんのスキルのリストです。その数を len(...) で数えます。
答えの例を見る
import json
with open("employees.json", encoding="utf-8") as f:
data = json.load(f)
print(len(data["employees"][1]["skills"]))お題② 部署が「営業」の人の名前だけを、表示してください。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
for で1人ずつ取り出し、if e["department"] == "営業": のときだけ、print(e["name"]) します。
答えの例を見る
import json
with open("employees.json", encoding="utf-8") as f:
data = json.load(f)
for e in data["employees"]:
if e["department"] == "営業":
print(e["name"])