標準ライブラリの Python JSON エンコーダーを拡張して、複素数のリストを、MATLAB の非公式の JSON ツールボックスであるJSONLABによって正しく解析される表現にエンコードしたいと考えています。簡単に言うと、単一の Python 複素数(x + yj)
を JSON 複素数オブジェクトとしてエンコードする必要があります。
{"_ArrayType_": "double",
"_ArraySize_": [1, 1],
"_ArrayIsComplex_": 1,
"_ArrayData_": [x, y]}
また、複素数のリストも単一の JSON 複素数オブジェクトになる[(x1 + y1j), (x2+y2j), (x3+y3j)]
必要があります。
{"_ArrayType_": "double",
"_ArraySize_": [1, 3],
"_ArrayIsComplex_": 1,
"_ArrayData_": [[x1, y1], [x2, y2], [x3, y3]]}
次のように、単一の複素数を正しくエンコードできました。
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, complex):
return {"_ArrayType_": "double", "_ArraySize_": [1, 1],
"_ArrayIsComplex_": 1, "_ArrayData_": [obj.real, obj.imag]}
return json.JSONEncoder.default(self, obj)
複素数リストの場合に簡単な拡張を試みましたが、うまくいきません:
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
# if obj is a list containing at least one complex number
if isinstance(obj, list) and sum(map(lambda x: isinstance(x, complex),
obj)):
data = [[elem.real, elem.imag] for elem in obj]
return {"_ArrayType_": "double", "_ArraySize_": [1, len(obj)],
"_ArrayIsComplex_": 1, "_ArrayData_": data}
elif isinstance(obj, complex):
return {"_ArrayType_": "double", "_ArraySize_": [1, 1],
"_ArrayIsComplex_": 1, "_ArrayData_": [obj.real, obj.imag]}
return json.JSONEncoder.default(self, obj)
このクラスを使用して複素数の Python リストを解析すると、結果は単一の JSON 複素数オブジェクトではなく、1x1 JSON 複素数オブジェクトの JSON リストになります。Python オブジェクトは、「トップダウン」ではなく「ボトムアップ」で解析され、複素数がリストにあることに気付く前に、1x1 JSON 複素数オブジェクトに変換されているようです。
複素数のリストを JSONLAB と互換性のある複素数オブジェクトにエンコードするにはどうすればよいですか?