我为什么会遇到这个simplejson异常?
为什么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个品牌)。
3 个回答
1
问题单 #6234 说如果不加 ensure_ascii=False
这个参数,就能解决问题(不过我不确定大家是否真的理解这个问题):
简单地不加 ensure_ascii 这个参数就能解决问题,虽然这样做似乎没有道理。
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
对象是一个查询集,而simplejson无法处理这种情况。试试使用django的 序列化 功能。 (或者把数据转换成列表。)
from django.core import serializers
json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(data, ensure_ascii=False, stream=response)
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>');
}