Заданный объект не является сериализуемым JSON

Когда я пытаюсь запустить следующий код:

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 s?

Ответ 1

Поверните настройки в списки перед сериализацией или используйте собственный обработчик default, чтобы сделать это:

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

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

Ответ 2

Вы не можете это исправить.

Эта ошибка означает, что только "json.dumps не поддерживает тип данных" set ". Вы должны знать, что JSON поступает из javascript. И нет такого типа данных, как Python" set "в javascript. Поэтому Python не может лечить ' set" используя JSON.

Итак, вам нужен другой подход, например, упомянутый @Martijn Pieters.


UPDATE

Я забыл это сказать.

Если вы хотите сбросить "набор" или любой другой объект python, который не поддерживается JSON, вы можете использовать модуль pickle или cPickle. Если вы используете "dump.txt" только из Python, это может быть полезно.

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)