Python 将对象列表编码为JSON对象

Python 将对象列表编码为JSON对象,python,json,matlab,Python,Json,Matlab,我想扩展标准的Python库,将复数列表编码成一个由非官方的JSON工具箱MATLAB正确解析的表示形式。简单地说,单个Python复数(x+yj)应编码为JSON复数对象 {"_ArrayType_": "double", "_ArraySize_": [1, 1], "_ArrayIsComplex_": 1, "_ArrayData_": [x, y]} {"_ArrayType_": "double", "_ArraySize_": [1, 3], "_ArrayIsComp

我想扩展标准的Python库,将复数列表编码成一个由非官方的JSON工具箱MATLAB正确解析的表示形式。简单地说,单个Python复数
(x+yj)
应编码为JSON复数对象

{"_ArrayType_": "double",
 "_ArraySize_": [1, 1],
 "_ArrayIsComplex_": 1,
 "_ArrayData_": [x, y]}
{"_ArrayType_": "double",
 "_ArraySize_": [1, 3],
 "_ArrayIsComplex_": 1,
 "_ArrayData_": [[x1, y1], [x2, y2], [x3, y3]]}
复数的列表
[(x1+y1j),(x2+y2j),(x3+y3j)]
也应该成为一个JSON复数对象

{"_ArrayType_": "double",
 "_ArraySize_": [1, 1],
 "_ArrayIsComplex_": 1,
 "_ArrayData_": [x, y]}
{"_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复数列表,则结果是1x1 JSON复数对象的JSON列表,而不是单个JSON复数对象。Python对象似乎是“自下而上”而不是“自上而下”解析的,在注意到它们在列表中之前,复数被转换为1x1 JSON复数对象


如何最好地将复数列表编码到与JSONLAB兼容的复数对象中?

通过简单查看源代码,除了自下而上之外,似乎没有其他简单的方法来编码JSON。我建议两种可能的解决方案:

  • 使用不可编辑或非列表对象(即
    json
    模块不解析的对象)来包含复数列表,这样它将由
    default()
    而不是
    json.jsonecoder
    编码
  • 在编码其余部分之前,先对复数列表进行编码,这样json编码器就不必“先编码父对象,再编码子对象”

您的第一个建议解决了我的问题:我将Python列表替换为numpy数组。除了不被
json
模块解析之外,它们更适合最终转换为MATLAB向量。