使用json序列化查询集的结果会引发错误:

时间:2011-07-16 20:43:36

标签: python django json serialization

我试图序列化一个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 个答案:

答案 0 :(得分:17)

“我正在尝试序列化Python列表...” 这实际上不是完整的故事 您正在尝试序列化ValuesListQuerySet

>>> type(ids)
<class 'django.db.models.query.ValuesListQuerySet'>

你可以  1.转换为其他优秀答案中提到的Python列表,或者  2.仅序列化ID。

Django有一种内置的序列化QuerySet的方法 并且您只需要ID,因此您可以使用fields kwarg。

from django.core import serializers
data = serializers.serialize('json', YourEntity.objects.all(), fields=('id',))

答案 1 :(得分:4)

阅读其他答案后编辑

我给出的原始答案(下面未删节)在诊断问题是正确的(传递给json函数的参数不是列表)。我正在离开它,因为它解释了调试程序(可能对其他类似的情况有用),但@Jacinda和@Adam的新答案更“重要”。特别是,后者包含有关如何使用本机django功能来解决问题的说明。

原始答案

不是100%肯定,因为我无法在我的系统上复制问题,但从外观来看,在我看来,这是数据类型/编码中的问题。

我首先要通过手动指定ids来重新测试您的代码:

ids = [335L, 468L, 481L, 542L, 559L, 567L, 609L]

(在我的系统中,您的代码适用于此情况)。如果它也适合您,那么在通过ids [您可以使用p.values_list('id',flat=True)]进行分配时,调查type(ids)的对象类型。可能是ids是一个对象,其表示与列表相同,但它不是列表。

在这种情况下,您可以在将它传递给json函数之前尝试进行类型转换:ids = list(p.values_list('id',flat=True)),但不保证它会起作用(这取决于p.values_list的返回值是否可迭代

HTH至少要追查这个问题!

答案 2 :(得分:3)

我遇到了同样的错误,经过多次混淆后,最终找到的解决方案在@afshin提出的问题的单一答案中如下:

ids = p.values_list('id',flat=True)
ids_list = list(ids)
import json
json.dumps(ids_list)

答案 3 :(得分:2)

这里的问题是values_list(),这是一个django函数(你可能应该在你的问题中澄清这一点)不返回列表。

>>> x = UserProfile.objects.values_list('employee_id', flat=True)
>>> type(x)
>>> <class 'django.db.models.query.ValuesListQuerySet'>

simplejson.dumps不知道如何序列化这个对象。所以像@mac建议的那样,你需要将这个返回值强制转换为列表。