【问题标题】:Encoding list of objects as JSON object将对象列表编码为 JSON 对象
【发布时间】:2013-10-16 19:21:37
【问题描述】:

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

{"_ArrayType_": "double",
 "_ArraySize_": [1, 1],
 "_ArrayIsComplex_": 1,
 "_ArrayData_": [x, y]}

一个复数列表[(x1 + y1j), (x2+y2j), (x3+y3j)]应该也成为一个单一的JSON复数对象,

{"_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 兼容的复数对象?

【问题讨论】:

    标签: python json matlab


    【解决方案1】:

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

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

    【讨论】:

    • 您的第一个建议解决了我的问题:我用 numpy 数组替换了 Python 列表。除了不被 json 模块解析之外,它们更自然地成为最终转换为 MATLAB 向量的候选对象。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2019-11-26
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多