Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでクラスをJSONシリアライズ可能にする方法【サンプルコード付き解説】


シリアライズ(直列化)とは、複雑なデータ型のオブジェクトをネイティブなデータ型へ変換し、その後JSON記法へ容易に変換できるようにするプロセスです。

Pythonのオブジェクト(辞書やリストなど)をJSON文字列に変換するには、json.dumps()メソッドを使用します。

また、Python標準ライブラリのpickleモジュールは、Pythonオブジェクト構造のシリアライズおよびデシリアライズに利用されます。pickleを使えば、Python内のあらゆるオブジェクトをディスク上に保存できる形にできます。pickleは、ファイルへ書き出す前にオブジェクトを「シリアライズ」します。ピクル化(pickling)とは、リストや辞書といったPythonオブジェクトを文字ストリームへ変換する手法のことです。

例1:json.dumps()で辞書をJSON文字列に変換する

import json

x = {
    "name": "Archana",
    "age": 30,
    "city": "Hyderabad"
}

# json.dumps()でJSON文字列に変換
y = json.dumps(x)
print(y)

実行結果

{"name": "Archana", "age": 30, "city": "Hyderabad"}

例2:辞書やリストの変換

import json

Emp = {
    1: "Archana",
    2: "Krishna",
    3: "Vineeth",
    4: "Ramesh"
}
jsonString = json.dumps(Emp)
print(jsonString)

Empid = [71, 72, 73, 74]
jsonString = json.dumps(Empid)
print(jsonString)

実行結果

{"1": "Archana", "2": "Krishna", "3": "Vineeth", "4": "Ramesh"}
[71, 72, 73, 74]

カスタムクラスをJSONシリアライズ可能にするには?

自作クラスのインスタンスをそのままjson.dumps()に渡すと、「Object of type ... is not JSON serializable」というエラーが発生します。これを回避するには、default引数に変換用の関数を指定します。

import json

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def encode_person(obj):
    if isinstance(obj, Person):
        return {"name": obj.name, "age": obj.age}
    raise TypeError(f"{type(obj).__name__} はJSONシリアライズできません")

p = Person("Archana", 30)
print(json.dumps(p, default=encode_person))

実行結果

{"name": "Archana", "age": 30}

また、dataclasses.dataclassで定義したクラスであれば、asdict()関数で一度辞書に変換してからjson.dumps()に渡す方法も便利です。用途に応じて使い分けるとよいでしょう。


  1. PythonでJSONファイルを読み込む方法をわかりやすく解説

    JSONファイルとは?JSON(JavaScript Object Notation)は、軽量なデータ交換フォーマットの一つです。人間にとって読み書きしやすく、機械にとっても解析や生成が容易なため、Webアプリケーションにおいてサーバーからクライアントへデータを送信する際などに広く利用されています。サンプルJSONファイル例1: { fruit: Apple, size: Large, color: Red }例2: { name: Karan, languages: [English, French] }JSONファイルの拡張子は「.json」です。P

  2. Pythonで対数ヒストグラムを作成する方法【matplotlib活用】

    Pythonのmatplotlibを使って対数(ログ)スケールのヒストグラムを作成するには、hist()メソッドの引数にlog=Trueを指定します。これにより、縦軸が対数スケールで表示され、値の範囲が大きく異なるデータも見やすく可視化できます。作成手順数値のリスト(配列)を用意します。density=Trueを指定して、正規化されたヒストグラムをプロットします。図を表示するには、show()メソッドを呼び出します。サンプルコードimport numpy as np import matplotlib.pyplot as plt plt.rcParams[figure.figsize] = [