我注意到我正在寻找的在python中将变量序列化为JSON的方法似乎并不能很好地处理它,对于我的目的,我只是想快速将对象内容转储为字符串格式,以便我可以挑选出我实际想要编写自定义代码来处理的内容。我希望能够转储主字段至少在任何类我传递python序列化器,如果它真的值得的名字,这应该工作。
那么用下面的代码:
import json
c = SomeClass()
#causes an error if any field in someclass has another class instance.
json.dumps(c)
导致. .
TypeError:类型{type}的对象不是JSON可序列化的
是否有其他人使用的模块可以解决我的问题?我真的不明白为什么会没有。或者可以解释一下如何避免这个错误?
我们的目标只是得到一些可供查看的输出。如果我在c#中使用反射写一个递归循环,除了循环引用,它不会很难,所以我无法想象python用户从来没有解决过这个确切的问题,我不满意我在以前的帖子中看到的答案,这些帖子似乎建议了很多自定义修补,似乎只是在精神上设计了一些旧对象的内容。
我甚至不需要复杂的遍历是有趣的部分,虽然它会很好。我只需要属性值的转储,这些属性值在很多情况下都是基本类型。我知道这是可能的,因为调试器会这样做。
另外,我看了其中一个方法,指示使用默认lambda来指定json序列化器应该如何下降到对象:
json.dumps(o, default=lambda k: k.__dict__)
对象不包含标准的字典成员。
最后我只是写了一个类来做这件事。
edit:
现在使用这个你可以用一种方式序列化一个类结构用我添加的这一小段代码来解决我的问题f**** discord.py !
结束编辑
没有立即忘记的选项可以理清大量的信息。
创建此解决方案的方法是管理单独的子类列表,以确保在达到stackoverflow之前不会递归。
槽_可以与getattr(o,name)一起使用,当hasattr(o,'dict')为False。
但答案是你必须创建一个解决方案,基本上完成json序列化器应该做的工作,并通过确定唯一的复杂类型并将它们写在json文件中的单独表格项中来减少循环引用,并将它们替换为引用类中的id。
这样你就可以在浏览这些对象时交叉引用它们。
然而,简短的答案是否定的。Python并没有提供一种开箱开箱的方式来做到这一点,迄今为止遇到的所有提供的答案都只解决了一个用例或场景,并且没有创建一个集成的解决方案来解决上述算法将类数据规范化为唯一元素的问题。