我有一个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
我知道我可以为json.JSONEncoder
具有自定义default
方法的类创建扩展,但是我什至不知道从哪里开始转换set
。是否应该set
使用默认方法中的值创建字典,然后返回该方法的编码?理想情况下,我想使默认方法能够处理原始编码器阻塞的所有数据类型(我将Mongo用作数据源,因此日期似乎也引发了此错误)
正确方向的任何提示将不胜感激。
编辑:
感谢你的回答!也许我应该更精确一些。
我利用(并赞成)这里的答案来解决set
翻译的局限性,但是内部键也是一个问题。
中的set
对象是转换为的复杂对象__dict__
,但它们本身也可以包含其属性值,这些值可能不符合json编码器中的基本类型。
涉及到很多不同的类型set
,并且哈希基本上为实体计算了唯一的ID,但是按照NoSQL的真正精神,没有确切说明子对象包含什么。
一个对象可能包含的日期值starts
,而另一个对象可能具有一些其他模式,该模式不包含包含“非原始”对象的键。
这就是为什么我唯一能想到的解决方案是扩展JSONEncoder
替换default
方法以打开不同情况的方法-但我不确定如何进行此操作,并且文档不明确。在嵌套对象中,是default
按键返回go 的值,还是只是查看整个对象的通用包含/丢弃?该方法如何容纳嵌套值?我已经看过先前的问题,但似乎找不到最佳的针对特定情况的编码的方法(不幸的是,这似乎是我在这里需要做的事情)。
dict
呢?我认为您只是想做一个list
集合,然后将其传递给编码器...例如:encode(list(myset))