2013-03-26 3 views
0

У меня есть следующий код:JSON сериализации ошибка с simplejson

data = {'services': [u'iTunes'], 
     'orders': [u'TestOrder', u'Test_April_Titles_iTunes'], 
     'providers': ''} 

return HttpResponse(simplejson.dumps(data)) 

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py" in default 
    178.   raise TypeError(repr(o) + " is not JSON serializable") 

Exception Type: TypeError at /reports/change_dropdown/ 
Exception Value: [u'iTunes'] is not JSON serializable 

Что мне нужно сделать, чтобы сериализовать этот словарь со списком внутри него?

+2

Какую версию 'simplejson' вы используете? Я почти уверен, что эта поддержка Unicode была добавлена ​​давным-давно. Что еще более важно, почему вы используете 'simplejson' вместо версии, встроенной в stdlib,' json', в 2.7? – abarnert

+0

[SSCCE] (http://SSCCE.org), пожалуйста. –

ответ

1

Проблема заключается в том, что itunes является совместимым типом не-JSON.

Для решения обеспечивает тип по умолчанию для преобразования не-JSON совместимых типов при сериализации:

simplejson.dumps(data, default=str)) 

или даже:

def handler(val): 
    if isinstance(val, unicode) 
     return str(val) 
    else: 
     return val 

simplejson.dumps(data, default=handler)) 

Преимущества второго варианта: вы можете обрабатывать наборы (например, конвертировать в список), даты (например, конвертировать в int timetstamp) и т. д.

0

Преобразования из unicode в str работал здесь:

data['services'] = [str(item) for item in data['services']] 
data['orders'] = [str(item) for item in data['orders']] 
data['providers'] = [str(item) for item in data['providers']] 
+1

JSON обрабатывает unicode просто отлично. Я думаю, что ваши типы не являются юникодами; возможно, они являются экземплярами BeautifulSoup NavigableText? Попробуйте преобразовать их в '' unicode() '* вместо. Вы в первую очередь хотите проверить их' type() 'в следующий раз. –

+0

Даже если вы используете формат (или библиотеку), который не обрабатывает Unicode, если у вас есть строки, отличные от ASCII, вы никогда не хотите просто конвертировать 'unicode' в' str'. Если вы знаете, что такое кодировка, используйте 'item.encode ('UTF-8')' (или что-то еще). Если вы не знаете, что такое кодировка ... вы, вероятно, захотите использовать '' unicodeescape'', так что вы можете выполнить его через 8-битный канал и восстановить его на другом конце. – abarnert

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