我有一个Python set
,其中包含具有__hash__
和__eq__
方法的对象,以确保不包含重复项。
我需要将这个结果set
进行JSON编码,但是将一个空的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
,哈希基本上计算实体的唯一标识符,但是按照 NoSQL 的真正精神,无法确定子对象包含什么。一个对象可能包含
starts
的日期值,而另一个对象可能具有包含不包含“非基元”对象的键的其他模式。这就是我能想到唯一的解决方案是扩展
JSONEncoder
并替换 default
方法以打开不同的情况 - 但我不确定如何开始,而文档含糊不清。在嵌套对象中,从 default 返回的值是否按键进行,还是只是一个通用的包含/丢弃,查看整个对象?该方法如何适应嵌套值?我已经查看了以前的问题,似乎找不到针对特定情况编码的最佳方法(不幸的是,这似乎是我要在这里做的)。
encode(list(myset))
。 - Constantinius