我想用JSON编码对象。但是,我不知道如何使输出没有字符串转义。
import json
class Abc:
def __init__(self):
self.name="abc name"
def toJSON(self):
return json.dumps(self.__dict__, cls=ComplexEncoder)
class Doc:
def __init__(self):
self.abc=Abc()
def toJSON(self):
return json.dumps(self.__dict__, cls=ComplexEncoder)
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Abc) or isinstance(obj, Doc):
return obj.toJSON()
else:
return json.JSONEncoder.default(self, obj)
doc=Doc()
print doc.toJSON()
结果是(转储返回一个字符串表示形式,这就是为什么要转义“的原因)
{"abc": "{\"name\": \"abc name\"}"}
我想要点不同的东西。预期结果是
{"abc": {"name": "abc name"}"}
但我不知道怎么。。。 有什么线索吗?
提前谢谢。
我之前的示例,以及另一个嵌套对象和您的建议:
产生预期结果:
谢谢。
所以,当前的问题是,您正在向json模块传递一个json值,它将被编码为json值中的另一个字符串。
更广泛的问题是,你正在极大地复杂化这一点。
在JSON datetime between Python and JavaScript的基础上,我将进一步介绍:
这让你:
这可以使它变得更干净/更安全(特别是,在调试/故障排除之外,通常不推荐使用抓取
__dict__
),但它应该能让人明白这一点。从根本上说,您只需要一种从树中的每个“节点”中获取json兼容对象(无论是简单的字符串或数字,还是列表或dict)的方法。该对象应该而不是已经是JSON序列化的对象,这就是您所做的。为了避免像Fred Laurent的答案那样重复代码,我重载了
__iter__()
方法,如下所示。这还允许“jsonize”列表元素、datetime和decimal,而不需要额外的依赖项,只需使用dict()。输出:
希望有帮助! 谢谢
相关问题 更多 >
编程相关推荐