繁体   English   中英

JSON在列表/二进制中序列化Python中的对象

[英]JSON serialize objects in Python in list / diconary

我对Python还是很陌生,我有一个相当大而复杂的数据结构,它是一个字典列表,其中包含不同对象的列表。 当我尝试通过json.dumps()将其转换为JSON时,我得到了标准

TypeError: <...> is not JSON serializable

我做了一些研究,大多数答案都指向编写自定义编码器的标准方法,这很好,我可以做到。 但是,我希望能够将我的整个数据结构发送到json.dumps(),而不是遍历所有内容,弄清楚它是什么类,并从头开始构建json对象。

有没有一种方法可以向python类本身添加编码器/解码器功能,所以当我向json.dumps发送复杂的数据结构时,该类本身知道该怎么做。

有什么神奇的to_json或某种方法添加自定义解码器到当json.dumps遇到该类时被调用的类吗?

当您使用json.dumps(my_object, cls=MyCustomJsonEncoder)时,自定义编码器类将为您处理该问题。 您的自定义编码器会覆盖default方法,该default方法使用self和对象o进行编码; 测试需要自定义序列化的不同类型,然后使用super(MyCustomJsonEncoder, self).default(o)将其余类型传递给默认类型。

我经常使用的一个简单示例如下:

class JSONEncoder(json.JSONEncoder):
    """
    Enhancement of base JSONEncoder, also handling these objects:
     * datetime.datetime
     * decimal.Decimal
     * uuid.UUID
    """

    def default(self, o):
        if isinstance(o, Decimal):
            return float(o)
        elif isinstance(o, UUID):
            return str(o)
        elif isinstance(o, datetime):
            return {
                '__type__': 'datetime',
                '__value__': o.isoformat(),
            }
        return super(JSONEncoder, self).default(o)

    @staticmethod
    def dumps(obj):
        return json.dumps(obj, cls=JSONEncoder)

正如史蒂文·沃尔夫(Steven Wolfe)在此线程中所述 ,您可能需要研究jsonpickle 该库允许对复杂的Python对象进行编码和解码。

您可以通过以下方式使用它:

import jsonpickle

f = open(filename, 'w')
encoded_string = jsonpickle.encode(obj)
f.write(encoded_string)
f.close()

要将数据检索为Python对象,只需使用jsonpickle.decode(encoded_string)方法。 如文档所述:

新对象具有相同的类型和数据,但现在基本上是原始对象的副本。

我认为这可能对您有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM