JSON在list / diconary

时间:2018-02-14 05:14:34

标签: python json

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

TypeError: <...> is not JSON serializable

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

有没有办法将编码器/解码器函数添加到python类本身,所以当我向json.dumps发送一个复杂的数据结构时,类本身就知道该怎么做。

是否有一些神奇的 to_json 或者某种方式将自定义解码器添加到json.dumps运行时调用的类?

2 个答案:

答案 0 :(得分:1)

使用json.dumps(my_object, cls=MyCustomJsonEncoder)时,自定义编码器类会为您处理。您的自定义编码器将覆盖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)

答案 1 :(得分:1)

正如史蒂芬沃尔夫在this thread中所说,你可能想看看jsonpickle。该库允许对复杂的Python对象进行编码和解码。

你可以这样使用它:

import jsonpickle

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

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

  

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

我认为这对您有用。