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

?

这只是一个简单的元组列表。它适用于我的其他格式几乎完全相同的硬编码列表。是因为字符串是unicode吗?我该如何处理?


当我将它编码为字典时它工作正常:

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

所以这不是前几个元组。您需要深入挖掘记录列表以缩小问题范围。如果它很大,也许可以取一些数据列表片段并尝试对它们进行编码,以查看错误是否发生在任何特定片段中。

更新:好的,这可能是因为您的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

Ticket #6234声称省略ensure_ascii=False将解决问题(但我不确定问题是否真的被理解):

只需省略 ensure_ascii 参数即可解决问题,即使它没有意义。

于 2010-07-17T00:30:24.913 回答
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>');
}
于 2010-08-04T20:25:33.933 回答