Python で Dataclass を JSON に変換する

Zeeshan Afridi 2023年6月21日
Python で Dataclass を JSON に変換する

このチュートリアルでは、JSON root ノードごとに dataclass を作成するために Python で JSON がどのようにサポートされているかを学習します。 また、Python での辞書としての dataclass の実装についても学習します。

dataclass を Python で JSON に変換

JavaScript Object Notation または JSON は、データがプログラミング言語のテキストで構成されるスクリプト (実行可能) ファイルを使用して保存および転送されることを示します。

Python は、JSON 組み込みモジュールを介して JSON をサポートします。 したがって、JSON パッケージを Python スクリプトにインポートして、この機能を活用します。

JSON で使用される引用符で囲まれた文字列には、キーと値のマッピングの値が含まれています。 Python の辞書に匹敵します。

Python は JSON 機能をネイティブにサポートし、JSON は標準ライブラリの marshal および pickle モジュールのユーザーに似た API を表示します。

一方、dataclass は、データを格納するために使用されるデータ転送オブジェクトを作成します。 これらのオブジェクトには、同等の比較、場合によっては表示のために、適切な定義メソッドが必要です。

dataclass は、データ転送クラスのメソッドと短い構文を作成するために使用されます。

Python で辞書として dataclass を実装する

Python 3.7 以降は、dataclass デコレータをサポートする唯一のバージョンです。 これは、一般にデータ転送オブジェクトと呼ばれるオブジェクトを生成し、その唯一の機能はデータを格納することです。

問題は、これらのオブジェクトに正しい機能を提供するには、等値比較、表示などのメソッドを作成する必要があることです。

これらの方法は、開発に手間がかかり、エラーが発生しやすいものでなければなりません。 dataclass はこれらすべてのメソッドを生成し、データ転送クラスに短い構文を与えます。

シリアライゼーションには、わずかに変更された (そしてやや効果的な) バージョンの dataclasses.asdict を使用します。

初めて JSON を dataclass インスタンスに逆シリアル化するときに、dataclass フィールドを反復し、注釈付きの型ごとにパーサーを作成すると、プロセスが繰り返されるときにより効果的になります。

Python で JSON root ノードごとに dataclass を作成する

"users" フィールドは "id""name" を持つオブジェクトの配列であるため、"Test""User" の 2つのクラスを作成する必要があることがわかります。

コード例:

from dataclasses import dataclass
from typing import List


@dataclass
class User:
    id: 1
    name: "Kelvin"


@dataclass
class Test:
    id: 2
    userid: " Jack"


users: List[User]

各 JSON 属性は、タイプ セーフな Python プロパティにマップする必要があります。

次のコードは、各 JSON ノードと属性を Python クラスとプロパティにマップします。 そのために、辞書を Python プロパティにマッピングする役割を担う Python クラスで static メソッドを作成します。

コード例:

from typing import List
from dataclasses import dataclass, asdict, field
from json import dumps


@dataclass
class Students:
    id: 1
    name: "stu1"

    @property
    def __dict__(self):
        return asdict(self)

    @property
    def json(self):
        return dumps(self.__dict__)


test_object_1 = Students(id=1, name="Kelvin")
print(test_object_1.json)

出力:

{"id": 1, "name": "Kelvin"}

データ転送オブジェクトは dataclasses によって作成され、それらにデータを格納するために使用されることに注意してください。 したがって、これらのオブジェクトには、同等の比較と場合によっては表示のために、正しいメソッドの定義が必要です。

データ転送クラスのメソッドと構文は、dataclass を使用して作成されます。

著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

関連記事 - Python Dataclass