カスタムJSONエンコード
Coddyの「Python JSON」コースのレッスン 6/9。
カスタムJSONエンコーディングは、JSONでネイティブにサポートされていない複雑なPythonオブジェクトをシリアル化できるようにする、Pythonのjsonモジュールの強力な機能です。これは、直接的なJSON表現を持たないカスタムクラスやオブジェクトを扱う場合に特に便利です。
JSONEncoderクラス
カスタムJSONエンコーダーを作成するには、json.JSONEncoderクラスを継承し、そのdefault()メソッドをオーバーライドする必要があります。
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, YourCustomClass):
return obj.to_dict() # オブジェクトを辞書に変換する
return json.JSONEncoder.default(self, obj)
カスタムエンコーダーの使用
カスタムエンコーダーを定義したら、json.dumps()またはjson.dump()で使用できます。
json_string = json.dumps(your_object, cls=CustomEncoder)
例:カスタムクラスのエンコーディング
実用的な例を見てみましょう。
import json
from datetime import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "birthdate": obj.birthdate.isoformat()}
elif isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
person = Person("Alice", datetime(1990, 5, 15))
json_string = json.dumps(person, cls=CustomEncoder, indent=2)
print(json_string)
この例では、カスタムのPersonクラスをエンコードし、その中のdatetimeオブジェクトを処理する方法を示しています。
重要なポイント
default()メソッドは、ネイティブにシリアル化できないオブジェクトに対して呼び出されます。- 未知の型については、常にデフォルトのエンコーダーにフォールバックする方法を提供してください。
- カスタムエンコーダーは、複雑なデータ構造、カスタムクラス、および非標準のPython型を処理するのに役立ちます。
カスタムJSONエンコーダーを使用することで、複雑なPythonオブジェクトをJSONワークフローにシームレスに統合でき、データのシリアル化がより柔軟で強力になります。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単ComplexNumber クラス用のカスタム JSON エンコーダーを作成してください。このエンコーダーは、複素数を実部と虚部に対応する 'real' および 'imag' キーを持つ JSON オブジェクトに変換する必要があります。
realとimag属性を持つComplexNumberクラスを定義します。ComplexNumberオブジェクトを処理するカスタムJSONEncoderサブクラスを作成します。ComplexNumberオブジェクトのリストを受け取り、カスタムエンコーダーを使用して JSON 文字列表現を返す関数を実装します。
以下の入力が提供されます:
3.14,2.71
1.41,-1.73
2.0,0
0,-1
各行は、カンマで区切られた実部と虚部を持つ複素数を表します。
結果の JSON 文字列を出力してください。JSON は 2 スペースのインデントでフォーマットされていることを確認してください。
自分で試してみよう
import json
# 入力を読み込む
complex_numbers = []
while True:
try:
line = input().strip()
if line:
real, imag = map(float, line.split(','))
complex_numbers.append((real, imag))
except EOFError:
break
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
# TODO: ComplexNumberオブジェクトを処理するカスタムJSONEncoderサブクラスを作成する
# TODO: ComplexNumberオブジェクトのリストを受け取り、JSON文字列を返す関数を実装する
# TODO: 入力データをComplexNumberオブジェクトに変換し、作成した関数を使用してJSON文字列を生成する
# 結果のJSON文字列を出力する
print(json_string)Python JSONのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ