LEVEL 9 ・ API / Lesson 23

JSONを読み書きする

APIの返事の形、JSON。辞書とリストにそっくりな形を、Pythonで読み書きします。

目安 18分 ・ インストール不要

このレッスンが終わったら

「JSONは、辞書とリストにそっくりな、文字だけのデータの書き方。json.load でPythonのデータにできる」と言える。

STEP 1

できることを見る

システム同士がデータをやり取りするとき、いちばんよく使われる書き方が、JSON(ジェイソン)です。見た目は、Lesson 08 で学んだ辞書とリストに、そっくりです。

ここに、社員3人の情報を、JSONで書いた employees.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"])
STEP 2

動かしてみる

JSONファイルを読むサンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

3 と 田中 が表示されました。JSONのファイルが、Pythonの辞書とリストとして読み込まれたのです。

STEP 3

1行ずつ読む

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」を表示する

日本語にすると

employees.json を開いて、JSONからPythonのデータに変換し、人数と、最初の人の名前を表示してください。

最後の行は、箱の中の箱を、順番に開けているイメージです。

  1. data全体(辞書)
  2. ["employees"]社員のリスト
  3. [0]最初の1人(辞書)
  4. ["name"]名前(田中)
辞書は「見出し」で、リストは「番号」で、順番に取り出していきます。

JSONと、Pythonのデータは、次のように対応しています。

JSONPython
{ "name": "田中" }(オブジェクト)辞書
[ 1, 2, 3 ](配列)リスト
"田中"文字列
120000数字
true / falseTrue / False
nullNone(何もない)
STEP 4

1か所だけ変える

① 全員を、順番に表示する。 リストの中身を、for で1人ずつ取り出します。

全員の名前と部署を表示するサンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

② 文字列のJSONを、Pythonのデータにする。 ファイルだけでなく、「JSONの文字」そのものも、変換できます。このとき使うのは、load ではなく loads(s = string = 文字列)です。

JSONの文字を、Pythonのデータに変換コードは書き換えられます
Ctrl / ⌘ + Enter でも実行
結果
▶ 実行を押すと、ここに結果が出ます

③ Pythonのデータを、JSONの文字にする。 逆の変換は、dumps です。indent=2 は、見やすく字下げする指定、ensure_ascii=False は、日本語をそのまま出す指定です。

Pythonのデータを、JSONの文字にするコードは書き換えられます
Ctrl / ⌘ + Enter でも実行
結果
▶ 実行を押すと、ここに結果が出ます

True が、JSONでは小文字の true になっていることに注目してください。

④ ファイルに保存する。 dump(ファイルに書く)を使います。

JSONファイルに保存して、読み戻すコードは書き換えられます
Ctrl / ⌘ + Enter でも実行
結果
▶ 実行を押すと、ここに結果が出ます

⑤ JSONの書き方を間違えると? JSONでは、文字を囲むのは、ダブルクォート(")だけです。シングルクォート(')だと、エラーになります。

シングルクォートで書いてみようコードは書き換えられます
Ctrl / ⌘ + Enter でも実行
結果
▶ 実行を押すと、ここに結果が出ます

JSONDecodeError: Expecting property name enclosed in double quotes(見出しは、ダブルクォートで囲んでください)と出ます。JSONのルールに合っていない、という意味です。

STEP 5

自分で書く

お題① employees.json を読み込んで、佐藤さんのスキルの数を表示してください。(佐藤さんは、リストの1番目です)

お題①:佐藤さんのスキルの数サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

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"]))

お題② 部署が「営業」の人の名前だけを、表示してください。

お題②:営業部の人の名前サンプルファイル付き・書き換えOK
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

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"])
STEP 6

仕事ならどう使う?