我正在尝试对嵌套对象进行编码/解码,我将嵌套对象的列表作为字符串而不是JSON对象。在
class A:
def __init__ (self, n, a):
self.n = n
self.a = a
class B:
def __init__ (self, b, listOfA):
self.b = b
self.listOfA = []
for a in listOfA:
self.listOfA.append(a)
class AEncoder:
def default (self, obj):
if isinstance (obj, A):
return {
'n' : obj.n
'a' : obj.a
}
return json.JSONEncoder.default(self, obj)
class BEncoder:
def default (self, obj):
if isinstance (obj, B):
return {
'b' : obj.n
'listOfA' : json.dumps(obj.listOfA, cls=AEncoder)
}
return json.JSONEncoder.default(self, obj)
listOfA = [A('n1', 'a1'), A('n2', 'a2')]
tmpB = B('b', listOfA)
对于对象A,它工作正常,因为它是相当直接的。B的输出如下:
^{pr2}$你知道我哪里错了吗?输出应如下所示:
{
"b" : "b"
"listOfA" : [{"n" : "n1", "a" : "a1"}, {"n" : "n2", "a" : "a2"}]
}
你的代码有一些打字错误,字典里没有逗号,当你在BEncoder中指的是obj.b时,你引用了obj.n。在
除此之外,问题是你正在使用json.dumps文件()在长椅上。此方法返回一个格式正确的json字符串。然后BEncoder看到这个字符串,并认为您希望listOfA的值是一个字符串,然后应该为json正确地编码,从而得到您看到的字符转义。在
这里有一个解决方案,不是返回字符串,而是根据编码器的需要返回“可序列化对象”(例如,list、dict等)。它正在用AEncoder().default()返回的字典(serializable)生成一个列表(可序列化)。在
输出:
^{pr2}$相关问题 更多 >
编程相关推荐