2.28. JSON¶
JSON(JavaScript Object Notation)は、構造化データのためのコンパクトで人が読める形式のテキスト形式です。6つの型 -- 文字列、数値、真偽値、null、配列、オブジェクト -- を定義し、それぞれが Python の値に直接対応します。そのため、Python と JSON の間の変換はどちら向きでも1回の関数呼び出しで済みます。
JSON は設定ファイルや Web API の共通語です。目で読める形式でディスクに小さな設定の束を保存したいときや、別のプログラムと構造化データをやり取りしたいときには、いつでもこれを使いましょう。
2つの関数でほとんどのニーズをカバーできます:
json.dumps()-- dump string: Python の値を JSON 文字列に変換します。json.loads()-- load string: JSON 文字列を解析して Python に戻します。
json.dump / json.load(s なし)の組み合わせは同じ仕事をしますが、ファイルオブジェクトを直接受け取ります。
2.28.1. エンコード(dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
出力:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
対応は次のとおりです:
そのセットの外にあるもの(カスタムクラス、bytes バッファ、set)は TypeError を送出します。先に値を変換してください。
注釈
CPython の json.dumps() は整形出力のための indent 引数を受け付けますが、MicroPython のものは受け付けません。唯一の整形のつまみは separators で、インラインの空白を制御します。最もコンパクトな形にするには (',', ':') を渡します。複数行でインデントされた出力が必要な場合は、手作業で生成する必要があります。
2.28.2. デコード(loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
出力:
OpenMV 320
JSON オブジェクトは dict に、配列は list になり、残りはそれぞれの Python の等価物に対応して戻ります。不正な JSON は ValueError を送出します。
2.28.3. ファイルの読み書き¶
ファイルベースの組み合わせは with とうまく連携します:
import json
with open("config.json") as f:
config = json.load(f)
config["width"] = 640
with open("config.json", "w") as f:
json.dump(config, f)
JSON ファイルは完全なレコードとして扱ってください。読み込み、Python の値を変更し、書き戻します。ファイル内で JSON をその場で編集しようとすると、たいてい救われる以上のバグを生みます。