2

標準ライブラリの 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 と互換性のある複素数オブジェクトにエンコードするにはどうすればよいですか?

4

1 に答える 1

1

ソース コードをざっと見てみるsimplejsonと、ボトムアップ以外の方法で JSON をエンコードする簡単な方法はないようです。私は2つの可能な解決策を提案します:

  • 反復不可能または非リスト オブジェクト (つまり、jsonモジュールが解析しないもの) を使用して複素数のリストを格納し、 によってエンコードされdefault()ないようにしjson.JSONEncoderます。
  • json エンコーダーが子オブジェクトの前に親オブジェクトのエンコードを処理する必要がないように、残りをエンコードする前に複素数のリストをエンコードします。
于 2013-10-16T20:08:31.820 に答える