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.loads なし)の組み合わせは同じ仕事をしますが、ファイルオブジェクトを直接受け取ります。

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

対応は次のとおりです:

  • dict(文字列キー)→ JSON オブジェクト。

  • listtuple → JSON 配列。

  • str → JSON 文字列。

  • intfloat → JSON 数値。

  • TrueFalseNonetruefalsenull

そのセットの外にあるもの(カスタムクラス、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 をその場で編集しようとすると、たいてい救われる以上のバグを生みます。