モジュールのレッスン (1/4)
JSON: シリアル化と解析
JSON は、最も普及しているデータ交換形式です。 json モジュール
標準ライブラリはそれをネイティブに処理します。
Python から JSON へ: dumps
json.dumps(object) は、Python オブジェクトを JSON 文字列にシリアル化します。
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 sortedJSON から Python へ: loads
json.loads(string) は、JSON 文字列を解析し、Python オブジェクトを返します。
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"] # 'Ada'
type(d) # <class 'dict'>型マッピング
| JSON | パイソン |
|---|---|
object | dict |
array | list |
string | str |
number | int / float |
true | True |
false | False |
null | None |
ファイルから: dump / load
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、カスタム クラスはデフォルトではシリアル化できません。
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable変換方法を示す default 関数を渡すことができます。
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」なし) も提供されており、コンテキスト マネージャーと自然に連携します。
with open("data.json", "w") as f:
json.dump(data, f)試してみてください
`data = {'nome': 'Ada', 'anni': 36}` とすると、それを indent=2 で JSON にシリアル化し、変数 `json_str` に代入します。 `json_str`を評価します。
ヒントを表示
json.dumps(データ、インデント=2)
3 回の試行後に解決策が利用可能になります
復習演習
JSON 文字列 s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]' を指定すると、json.loads を使用してそれをデータに解析し、合計 'v' 値の合計を計算します。合計を評価します。
ヒントを表示
json.loads は辞書のリストを返します。
3 回の試行後に解決策が利用可能になります
追加の課題
JSON 文字列 \`json_data = '{"name": "Alice", "age": 30}'\` を指定すると、\`json.loads\` を使用してそれを Python 辞書にデコードします。 \`'name'\` キーに関連付けられた値を抽出し、それを \`user_name\` に保存します。最後に、\`user_name\` を評価します。
ヒントを表示
json.loads(json_data) を使用してデコードし、data['name'] 経由でアクセスします。
3 回の試行後に解決策が利用可能になります