Почему я получаю это простое исключение? - PullRequest
1 голос
/ 17 июля 2010

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

[(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).

Ответы [ 3 ]

2 голосов
/ 17 июля 2010

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

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"]]'

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

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

from django.core import serializers
json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(data, ensure_ascii=False, stream=response)
1 голос
/ 17 июля 2010

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

Просто пропустите параметр sure_asciiрешает проблему, хотя это не имеет смысла.

0 голосов
/ 05 августа 2010

вместо

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>');
}
...