2010-07-16 3 views
1

Почему Django дает мне это исключениеПочему я получаю это исключение simplejson?

[(7, u'Acura'), (18, u'Alfa Romeo'), ...] is not JSON serializable 

Когда я пытаюсь

data = VehicleMake.objects.filter(model__start_year__gte=request.GET.get('year',0)).values_list('id','name') 
return HttpResponse(simplejson.dumps(data, ensure_ascii=False), mimetype='application/json') 

?

Это простой список кортежей. Он работает с моим другим жестко запрограммированным списком, который почти в том же формате. Это потому, что строки являются unicode? Как мне это обработать?


Он отлично работает, когда я закодировать его как Dict:

def get_makes(request): 
    year = request.GET.get('year',0) 
    data = VehicleMake.objects.filter(model__start_year__lte=year, model__stop_year__gte=year).order_by('name').distinct().values_list('id','name') 
    return HttpResponse(simplejson.dumps(odict(data), ensure_ascii=False), mimetype='application/json') 

Некоторые марки имеют акцентированные символы ... это может быть это? Да, список большой (~ 900 составляет всего).

+0

simplejson может обрабатывать строки Unicode просто отлично. Можете ли вы показать нам полные данные? –

+0

@Ned: Есть около 900 записей .... и это было b ** ch для моего, так что нет. – mpen

ответ

0

Вместо

return HttpResponse(simplejson.dumps(data, ensure_ascii=False), mimetype='application/json') 

list(data) использования и изменить Javascript для работы с ней.

for(i in values) { 
    $select.append('<option value="'+values[i][0]+'">'+values[i][1]+'</option>'); 
} 
2

Это, кажется, работает нормально:

In [28]: a = [(7, u'Acura'), (18, u'Alfa Romeo'),] 

In [29]: simplejson.dumps(a, ensure_ascii=False) 
Out[29]: u'[[7, "Acura"], [18, "Alfa Romeo"]]' 

Так что это не первая пара кортежей. Вам нужно будет углубиться в список записей, чтобы сузить проблему. Если он большой, возможно, возьмите несколько фрагментов списка данных и попробуйте их кодировать, чтобы увидеть, происходит ли ошибка в каком-либо конкретном сегменте.

UPDATE: ОК, это, вероятно, потому, что ваш объект data является QuerySet, и simplejson не справляется с этим. Попробуйте вместо этого использовать django's serialize. (Или принуждать данные в список.)

from django.core import serializers 
json_serializer = serializers.get_serializer("json")() 
json_serializer.serialize(data, ensure_ascii=False, stream=response) 
+0

Я думаю, 'stream' должен быть' sys.stdout'? – mpen

+1

Вы можете использовать stdout, и он будет выгружать вывод там. Но в представлении это должен быть объект ответа (response = HttpResponse()), а затем вы можете просто «вернуть ответ» – ars

+0

Ох .... правильно! Вот как это работает: p – mpen

1

Ticket #6234 утверждает, что выходя из ensure_ascii=False будет решить эту проблему (но я не уверен, если проблема действительно понял):

Просто опуская ensure_ascii параметр решает проблему, даже если это не имеет смысла.

+1

Nope. Первоначально было без него. Спасибо, тo. – mpen

+0

+1 для усилий .. – mpen

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