Python:将对象序列化为JSON

5

我有以下对象:

import os
import sys
import json

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, P):
            return json.dumps(obj.__dict__)
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default(self, obj)

class P(object):
    def __init__(self):
        self.name = "Unknown"
        self.id = 1
        self.lst = []

    def showName(self):
        print(self.name)
        for item in self.lst:
            item.showName()

    def add(self, p):
        self.lst.append(p)

    def serialize(self):
        return json.dumps(self, cls=ComplexEncoder)

class PFirst(P):
    def __init__(self):
        P.__init__(self)
        self.name = "First"
        self.id = 2

p1 = PFirst()
p1.showName()

p = P()
p.add(p1)
p.showName()

print(p.serialize())

我想制作一个JSON来表示p对象的属性,但是我收到了以下错误:

TypeError: <__main__.PFirst object at 0x000002AA287F1438> is not JSON serializable

有人可以帮我吗?

1个回答

6
        return json.dumps(obj.__dict__)

您正在再次使用默认编码器调用 json.dumps,这个编码器肯定不知道如何处理 P 对象。如果您确实想要调用 json.dumps,请使用以下代码:

        return json.dumps(obj.__dict__, cls=type(self))
#                                     ^~~~~~~~~~~~~~~~

然而!如果打印结果,我们会发现结果被双重编码为字符串:
"{\"name\": \"Unknown\", \"id\": 1, \"lst\": [\"{\\\"name\\\": \\\"First\\\", \\\"id\\\": 2, \\\"lst\\\": []}\"]}"

如果你查看 ComplexEncoder 的例子,以及 default() 文档,我们会注意到它应该返回一个“可序列化的对象”,而不是序列化后的字符串。因此,你真正需要编写的是:
class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, P):
            return obj.__dict__         # <-----
        return json.JSONEncoder.default(self, obj)

输出:

{"name": "Unknown", "id": 1, "lst": [{"name": "First", "id": 2, "lst": []}]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接