1

なぜ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')

タプルの単純なリストです。これは、ほぼ同じ形式のハードコードされた他のリストで機能します。文字列がユニコードだからですか?どうすればそれを処理できますか?


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になります)。

4

3 に答える 3

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

したがって、これは最初の2つのタプルではありません。問題を絞り込むには、レコードリストをさらに深く掘り下げる必要があります。大きい場合は、データリストの一部を取得してエンコードしてみて、特定のセグメントでエラーが発生するかどうかを確認してください。

更新:わかりました。dataオブジェクトがQuerySetであり、simplejsonがそれを処理しないことが原因である可能性があります。代わりにdjangoのシリアル化を使用してみてください。(または、データをリストに強制します。)

from django.core import serializers
json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(data, ensure_ascii=False, stream=response)
于 2010-07-17T00:13:20.073 に答える
1

チケット#6234は、除外することで問題が解決すると主張してensure_ascii=Falseいます(ただし、問題が本当に理解されているかどうかはわかりません)。

意味がない場合でも、ensure_asciiパラメーターを省略するだけで問題は解決します。

于 2010-07-17T00:30:24.913 に答える
0

それ以外の

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

Javascriptを使用list(data)および変更して、Javascriptを使用します。

for(i in values) {
    $select.append('<option value="'+values[i][0]+'">'+values[i][1]+'</option>');
}
于 2010-08-04T20:25:33.933 に答える