不是 JSON 可序列化的
Posted
技术标签:
【中文标题】不是 JSON 可序列化的【英文标题】:is not JSON serializable 【发布时间】:2013-04-26 12:29:50 【问题描述】:我有以下列表视图
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
有什么想法吗?
【问题讨论】:
什么是国家型号? 回溯是什么? 换行是否有效:return json.dumps(list(self.get_queryset().values_list('code', flat=True)))
?
添加列表时出现'str' object has no attribute 'status_code'
错误
回溯就像["ae", "ag", "ai", "al", "am", "ao", "ar", "at", "au", "aw", "az", "ba", "bb", "bd", "be", "bg", "bh", "bl", "bm", "bn", "bo", "bq", "br", "bs", "bt", "by", "bz", "ca", "ch", "ck", "cl", "cm", "cn", "co"]
【参考方案1】:
值得注意的是QuerySet.values_list()
方法实际上并没有返回一个列表,而是一个django.db.models.query.ValuesListQuerySet
类型的对象,为了保持Django惰性求值的目标,即生成“列表”所需的DB查询在评估对象之前不会实际执行。
不过,有点恼人的是,这个对象有一个自定义的__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')
...然后你可以从你的函数中返回。
【讨论】:
【参考方案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 也很重要。
【讨论】:
以上是关于不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章
Django:“TypeError:[] 不是 JSON 可序列化的”为啥?