Python

dataclass_jsonを利用したJSONとPythonオブジェクトの相互変換

今回はdataclasses-jsonを紹介します。名前の通り、PythonのdataclassとJSONを上手く連携させるためのライブラリになっています。
この記事ではこのライブラリの簡単な使い方を紹介します。

クラス定義

まずは、JSONと連携させるためのクラスを作成します。
@dataclassの前に@dataclass_jsonを付与することで利用できます。
letter_caseではJSONのプロパティ名の記法を指定できます。
LetterCase.CAMELを指定することで、pythonではスネークケースを使いつつJSONではキャメルケースを利用するように変換方法を指定できます。

from dataclasses import dataclass

from dataclasses_json import LetterCase, dataclass_json


@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class User:
    first_name: str
    last_name: str
    age: int

JSON→dataclass

以下のようなコードでJSONからUserオブジェクトを作成できます。

user_json = '{"firstName": "First", "lastName": "Last", "age": 24}'

user_schema = User.schema()
user1: 'User' = user_schema.loads(user_json)

user1 # User(first_name='First', last_name='Last', age=24)

JSONの値の型が誤っていた場合、以下のようなエラーが起きます。

user_json = '{"firstName": "First", "lastName": 2, "age": 24}'

user_schema = User.schema()
user1: 'User' = user_schema.loads(user_json)
# marshmallow.exceptions.ValidationError: {'lastName': ['Not a valid string.']}

dataclass→JSON

以下のようなコードでUserオブジェクトからJSONを生成できます。
キャメルケースに自動的に変換されていることがわかります。

user2 = User('First', 'Last', 35)
user_schema = User.schema()
user_schema.dumps(user2)
# {"lastName": "Last", "firstName": "First", "age": 35}

 

次にlast_nameをint型の値にしてみます。
この場合、オブジェクト生成時にもJSON生成時にもエラーは起きません。
JSONに変換する際には自動で文字列に変換されるようです。

user2 = User('First', 'Last', 35)
user_schema = User.schema()
user_schema.dumps(user2)
# {"firstName": "First", "lastName": "2", "age": 35}

おわりに

今回はdataclasses-jsonを紹介しました。
Pythonの処理の入出力としてJSONを使う際に利用してみてはいかがでしょうか。

Y.N
GRIでデータ分析やアルゴリズム開発、ForecastFlowの開発に携わっています。