的Python:序列化对象到JSON
问题描述:
所以我有以下对象:的Python:序列化对象到JSON
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())
我要让这reprezents对象p
的属性的JSON,但我收到以下错误:
TypeError: <__main__.PFirst object at 0x000002AA287F1438> is not JSON serializable
有人可以帮帮我吗?
答
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
例子,也是documentation of 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": []}]}
是的,它的工作原理。非常感谢你 –