我为什么会遇到这个simplejson异常?

1 投票
3 回答
816 浏览
提问于 2025-04-16 01:25

为什么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>');
}

撰写回答