集合对象无法被JSON序列化

49 投票
2 回答
116141 浏览
提问于 2025-04-17 21:30

当我尝试运行以下代码时:

import json

d = {'testing': {1, 2, 3}}
json_string = json.dumps(d)

我遇到了以下错误:

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    json_string = json.dumps(d)
  File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set([1, 2, 3]) is not JSON serializable

我该怎么做才能成功使用 json.dumps 来处理包含 set 的对象呢?

2 个回答

2

这个问题是没法解决的。

这个错误的意思是“json.dumps不支持‘集合’这种数据类型”。你要知道,JSON是来源于JavaScript的,而JavaScript里没有像Python的“集合”这种数据类型。所以Python无法用JSON来处理‘集合’。

所以你需要换个方法,就像@Martijn Pieters提到的那样。


更新

我忘了说这一点。

如果你想处理“集合”或者其他不支持JSON的Python对象,你可以使用pickle或者cPickle模块。如果你只用Python来生成“dump.txt”,这可能会对你有帮助。

import cPickle

d = {'testing': {1, 2, 3}}

#dump
with open("pickledump.txt", "w") as fp:
    cPickle.dump(d, fp)

#load
with open("pickledump.txt", "r") as fp:
    x = cPickle.load(fp)
89

在把集合(sets)转换成可以保存的格式之前,先把它们变成列表(lists),或者使用一个自定义的 default 处理器来完成这个操作:

def set_default(obj):
    if isinstance(obj, set):
        return list(obj)
    raise TypeError

result = json.dumps(yourdata, default=set_default)

撰写回答