姬長信(Redy)

如何JSON序列化集?


我有一个Python集,其中包含带有__hash__和__eq__方法的对象,以确保集合中不包含任何重复项.

我需要对这个结果集进行json编码,但是将一个空集传递给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类的扩展,但我甚至不确定在转换集合时从哪里开始.我应该在默认方法中使用设置值创建字典,然后返回编码吗?理想情况下,我想使默认方法能够处理原始编码器所扼杀的所有数据类型(我使用Mongo作为数据源,所以日期似乎也引发了这个错误)

任何暗示正确的方向将不胜感激.

编辑:

谢谢你的回答!也许我应该更精确.

我在这里使用(和upvoted)答案来解决被翻译集合的限制,但是内部键也是一个问题.

集合中的对象是转换为__dict__的复杂对象,但它们本身也可以包含其属性的值,这些值可能不适用于json编码器中的基本类型.

这个集合中有很多不同的类型,哈希基本上计算了实体的唯一ID,但是在NoSQL的真正精神中,并没有确切知道子对象包含的内容.

一个对象可能包含启动的日期值,而另一个可能包含一些其他架构,其中不包含包含“非基元”对象的键.

这就是为什么我能想到的唯一解决方案是扩展JSONEncoder来替换默认方法来打开不同的情况 – 但我不知道如何解决这个问题并且文档含糊不清.在嵌套对象中,默认返回的值是否按键,或者只是查看整个对象的通用include / discard?该方法如何适应嵌套值?我已经查看过以前的问题,似乎无法找到针对特定情况编码的最佳方法(遗憾的是,这似乎是我需要在这里做的).