今回はPythonのdataclassを使用してJSONファイルへの出力を解説します。
サンプルコード
こちらがdataclassを使ったJSONファイルへの出力するサンプルになります。
import json
from dataclasses import asdict, dataclass
@dataclass
class User:
name: str
age: int
note: str
# ユーザインスタンス生成
user_taro = User(name="taro", age=18, note="高校生")
user_yuta = User(name="yuta", age=20, note="大学生")
with open("taro.json", "w", encoding="utf-8") as f:
# ensure_accii=Falseで日本語がそのまま出力される
json.dump(asdict(user_taro), f, ensure_ascii=False)
with open("yuta.json", "w", encoding="utf-8") as f:
# インデントがつく
json.dump(asdict(user_taro), f, indent=4, ensure_ascii=False)
一
dataclassを定義
dataclassを使うには標準モジュールであるdataclasses.dataclassを使用します。
※Python3.7以上
もしくはpydantic.dataclassesでも良いです。
from dataclasses import asdict, dataclass
@dataclass
class User:
name: str
age: int
note: str
JSONへの出力はjson.dump
jsonへの出力は標準モジュールのjson.dump
を使用します。
# ユーザインスタンス生成
user_taro = User(name="taro", age=18, note="高校生")
user_yuta = User(name="yuta", age=20, note="大学生")
with open("taro.json", "w", encoding="utf-8") as f:
# ensure_accii=Falseで日本語がそのまま出力される
json.dump(asdict(user_taro), f, ensure_ascii=False)
with open("yuta.json", "w", encoding="utf-8") as f:
# インデントがつく
json.dump(asdict(user_taro), f, indent=4, ensure_ascii=False)
ここで注目するのはasdict()です。
asdictはdataclassのインスタンスに定義されているフィールドをフィールド名: フィールド値のdict型で出力してくれます。
例えば上記でuser_taroインスタンスを生成しています。
ここでasdictを行うと
print(asdict(user_taro))
# {'name': 'taro', 'age': 18, 'note': '高校生'}
以上のようにdict型として出力してくれます。
これとJSON出力が非常に相性が良いです。
with open("taro.json", "w", encoding="utf-8") as f:
# ensure_accii=Falseで日本語がそのまま出力される
json.dump(asdict(user_taro), f, ensure_ascii=False)
ここでJSONファイルを出力しています。
json.dumpの第一引数には出力するdict型を指定します。
ここで、dataclassのasdictを使用することで簡単にjsonファイルへの出力が可能になります。
ちなみにindent引数を入れると出力結果に違いが現れます。
with open("taro.json", "w", encoding="utf-8") as f:
# ensure_accii=Falseで日本語がそのまま出力される
json.dump(asdict(user_taro), f, ensure_ascii=False)
with open("yuta.json", "w", encoding="utf-8") as f:
# インデントがつく
json.dump(asdict(user_taro), f, indent=4, ensure_ascii=False)
上記の場合、結果は以下のようになります
{"name": "taro", "age": 18, "note": "高校生"}
{
"name": "taro",
"age": 18,
"note": "高校生"
}
まとめ
今回はdataclassを使ってJSONファイルを出力する方法をまとめました。
まとめです。
json.dump()の第一引数にasdict()したdataclassを指定する。
以上になります。