为什么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总计)。
答案 0 :(得分: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"]]'
所以这不是第一对元组。您需要深入挖掘记录列表以缩小问题范围。如果它很大,可能需要对数据列表进行一些切片并尝试对其进行编码,以查看是否在任何特定段中发生错误。
更新:好的,可能是因为你的data
对象是一个QuerySet而simplejson没有处理它。尝试使用django的serialize代替。 (或者将数据强制列入清单。)
from django.core import serializers
json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(data, ensure_ascii=False, stream=response)
答案 1 :(得分:1)
Ticket #6234声称遗漏ensure_ascii=False
会解决问题(但我不确定问题是否真的被理解):
简单地省略ensure_ascii参数就可以解决问题,即使它没有任何意义。
答案 2 :(得分: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>');
}