序列化查询集结果为JSON时出错:
我在尝试把一个Python列表转换成可存储的格式时,遇到了错误,提示说这个列表不能被序列化。请问在序列化长整型数字的列表时,有什么限制吗?
>>> ids=p.values_list('id',flat=True)
>>> ids
[335L, 468L, 481L, 542L, 559L, 567L, 609L]
>>> import simplejson as json
>>> str=json.dumps(ids)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\__ini
t__.py", line 265, in dumps
return _default_encoder.encode(obj)
File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\encod
er.py", line 216, in encode
chunks = list(chunks)
File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\encod
er.py", line 495, in _iterencode
o = _default(o)
File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\encod
er.py", line 190, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [335L, 468L, 481L, 542L, 559L, 567L, 609L] is not JSON serializable
>>>
4 个回答
我也遇到了同样的错误,经过很多困惑之后,终于找到了解决办法。下面是我为@afshin提问的这个问题总结的一个简单答案:
ids = p.values_list('id',flat=True)
ids_list = list(ids)
import json
json.dumps(ids_list)
在阅读其他回答后更新
我之前给出的原始回答(下面没有删减)在诊断问题上是正确的(传递给json函数的参数不是一个列表)。我保留这个回答,因为它解释了调试的过程(可能对其他类似情况有用),但@Jacinda和@Adam的新回答更直接。特别是后者包含了如何使用Django的原生功能来解决这个问题的说明。
原始回答
我不能百分之百确定,因为我在我的系统上无法重现这个问题,但从表面上看,似乎是数据的类型或编码出了问题。
我建议你重新测试一下你的代码,手动给ids
赋值:
ids = [335L, 468L, 481L, 542L, 559L, 567L, 609L]
(在我的系统上,你的代码在这种情况下是可以工作的)。如果在你那也能工作,那么就要调查一下通过p.values_list('id',flat=True)
赋值后的ids
是什么类型的对象[你可以用type(ids)
来查看]。可能ids
是一个看起来像列表的对象,但实际上并不是一个列表。
在这种情况下,你可以尝试类型转换:在传递给json函数之前,先用ids = list(p.values_list('id',flat=True))
,但不能保证这样就一定有效(这取决于p.values_list
返回的值是否可以迭代)。
希望这至少能帮助你找到问题所在!
“我正在尝试将一个Python列表进行序列化...”
其实这并不是全部的情况。
你实际上是在尝试序列化一个 ValuesListQuerySet
。
>>> type(ids)
<class 'django.db.models.query.ValuesListQuerySet'>
你可以选择:
1. 按照其他很棒的回答中提到的方法,将其转换为Python列表,或者
2. 只序列化ID。
Django提供了一种内置的方法来序列化 QuerySet
。
而你只想要ID,所以可以使用 fields
这个参数。
from django.core import serializers
data = serializers.serialize('json', YourEntity.objects.all(), fields=('id',))