python

【Python】dataclassを使ってJSONファイルへの出力を行う

今回は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を指定する。

以上になります。