不是JSON可序列化的

时间:2013-05-02 10:55:53

标签: python django json

我有以下ListView

import json
class CountryListView(ListView):
     model = Country

    def render_to_response(self, context, **response_kwargs):

         return json.dumps(self.get_queryset().values_list('code', flat=True))

但我得到以下错误:

[u'ae', u'ag', u'ai', u'al', u'am', 
u'ao', u'ar', u'at', u'au', u'aw', 
u'az', u'ba', u'bb', u'bd', u'be', u'bg', 
u'bh', u'bl', u'bm', u'bn', '...(remaining elements truncated)...'] 
is not JSON serializable

有什么想法吗?

2 个答案:

答案 0 :(得分:68)

我会添加一个稍微详细的答案。

值得注意的是QuerySet.values_list()方法实际上并不返回列表,而是返回类型为django.db.models.query.ValuesListQuerySet的对象,以便维护Django的延迟评估目标,即生成所需的数据库查询在评估对象之前,“list”实际上并未执行。

但是,有点恼火的是,这个对象有一个自定义的__repr__方法,当打印出来时它看起来像一个列表,所以这个对象实际上不是一个列表并不总是很明显。

问题中的异常是由于自定义对象无法在JSON中序列化,因此您必须首先将其转换为列表,并使用...

my_list = list(self.get_queryset().values_list('code', flat=True))

...然后您可以使用...

将其转换为JSON
json_data = json.dumps(my_list)

您还必须将生成的JSON数据放在HttpResponse对象中,apparently应该有Content-Type application/json,...

response = HttpResponse(json_data, content_type='application/json')

...然后你可以从你的功能中返回。

答案 1 :(得分:2)

class CountryListView(ListView):
     model = Country

    def render_to_response(self, context, **response_kwargs):

         return HttpResponse(json.dumps(list(self.get_queryset().values_list('code', flat=True))),mimetype="application/json") 

解决了问题

mimetype也很重要。