メインコンテンツにスキップ
モジュール 8 · レッスン 1 / 4コース内の 29/36~10 min
モジュールのレッスン (1/4)

JSON: シリアル化と解析

JSON は、最も普及しているデータ交換形式です。 json モジュール 標準ライブラリはそれをネイティブに処理します。

Python から JSON へ: dumps

json.dumps(object) は、Python オブジェクトを JSON 文字列にシリアル化します。

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

JSON から Python へ: loads

json.loads(string) は、JSON 文字列を解析し、Python オブジェクトを返します。

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

型マッピング

JSONパイソン
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

ファイルから: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

with open("config.json") as f:
    dati = json.load(f)

末尾に「s」を付けないと、文字列に「s」を付けてファイル (ファイルに似た) を操作します。

シリアル化できない型: default

datetime、set、カスタム クラスはデフォルトではシリアル化できません。

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

変換方法を示す default 関数を渡すことができます。

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON とファイル操作

標準ライブラリには、JSON データをファイルに直接読み書きするための json.dump() および json.load() (「s」なし) も提供されており、コンテキスト マネージャーと自然に連携します。

Python
with open("data.json", "w") as f:
    json.dump(data, f)

試してみてください

運動#python.m8.l1.e1
試行回数: 0読み込み中…

`data = {'nome': 'Ada', 'anni': 36}` とすると、それを indent=2 で JSON にシリアル化し、変数 `json_str` に代入します。 `json_str`を評価します。

エディターを読み込み中…
ヒントを表示

json.dumps(データ、インデント=2)

3 回の試行後に解決策が利用可能になります

復習演習

運動#python.m8.l1.e2
試行回数: 0読み込み中…

JSON 文字列 s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]' を指定すると、json.loads を使用してそれをデータに解析し、合計 'v' 値の合計を計算します。合計を評価します。

エディターを読み込み中…
ヒントを表示

json.loads は辞書のリストを返します。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#python.m8.l1.e3
試行回数: 0読み込み中…

JSON 文字列 \`json_data = '{"name": "Alice", "age": 30}'\` を指定すると、\`json.loads\` を使用してそれを Python 辞書にデコードします。 \`'name'\` キーに関連付けられた値を抽出し、それを \`user_name\` に保存します。最後に、\`user_name\` を評価します。

エディターを読み込み中…
ヒントを表示

json.loads(json_data) を使用してデコードし、data['name'] 経由でアクセスします。

3 回の試行後に解決策が利用可能になります