最佳答案
我有一个Python set
,它包含具有__hash__
和__eq__
方法的对象,以确保集合中不包含重复项。
我需要json编码这个结果set
,但即使传递一个空的set
给json.dumps
方法也会引发TypeError
。
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set([]) is not JSON serializable
我知道我可以为具有自定义default
方法的json.JSONEncoder
类创建一个扩展,但我甚至不确定从哪里开始转换set
。我是否应该在默认方法中创建一个set
值的字典,然后返回编码?理想情况下,我希望使默认方法能够处理原始编码器阻塞的所有数据类型(我使用Mongo作为数据源,因此日期似乎也会引发这个错误)
任何正确方向的提示都将不胜感激。
编辑:
谢谢你的回答!也许我应该说得更准确些。
我利用(并投票)这里的答案来解决set
被翻译的限制,但内部键也是一个问题。
set
中的对象是可转换为__dict__
的复杂对象,但它们本身也可以包含其属性的值,这些值可能不适用于json编码器中的基本类型。
set
中有很多不同的类型,散列基本上为实体计算一个唯一的id,但在NoSQL的真正精神中,并没有确切地告诉子对象包含什么。
一个对象可能包含starts
的日期值,而另一个对象可能具有一些其他模式,其中不包含包含“非原语”对象的键。
这就是为什么我能想到的唯一解决方案是扩展JSONEncoder
来取代default
方法来打开不同的情况-但我不确定如何做到这一点,而且文档是模糊的。在嵌套对象中,从default
返回的值是按键返回的,还是只是一个通用的包含/丢弃,查看整个对象?该方法如何容纳嵌套值?我已经浏览了以前的问题,但似乎无法找到特定于情况的编码的最佳方法(不幸的是,这似乎是我在这里需要做的)。