2014-03-09 5 views
16

Когда я пытаюсь запустить следующий код:множество объектов не 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?

ответ

30

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

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

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

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

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

Так что вам нужен другой подход, как упоминалось @Martijn Питерс.


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) 
+0

Зачем голосовали? –

+2

Обратите внимание на мой нижний предел, но я бы рискнул предположить, что нижняя сторона была основана на вашем исходном посте, которое можно было бы читать как «вы не можете этого сделать» (что, очевидно, знает OP, так как об этом спрашивают) «см. ответ Мартинна». –

+1

Да ... ты прав. Я должен сказать: «Вам нужен другой подход, потому что вы не можете хранить« набор »Python в формате json». –

Смежные вопросы