Django:“TypeError:[]不是JSON可序列化的”为什么?

时间:2010-02-11 07:58:33

标签: python django json

这怎么会引起这个错误?我进入了这个:

def json(self):
    return json.dumps(
        {
            'items': self.items
        }
    )

并得到了该错误(因为self.items是一个空的查询集(Django)

然后,

def json(self):
    return json.dumps(
        {
            'items': []  # Pass in empty list to prove that the error was idiotic.
        }
    )

工作正常(至少证明错误信息毫无价值)

这是因为查询集定义了 repr ()并且当它是空的时候返回'[]'或者像那样荒谬的东西吗?

3 个答案:

答案 0 :(得分:59)

查询集不可开箱即用。如果您尝试list(self.items)而不仅仅是self.items,那么只要项目本身是JSON可序列化的,那就应该有效。

更新:即使它不为空,也会引发异常。我不认为它会被接受为Django错误,当然你可以尝试;最简单的答案是使用list(qs)强制进行评估,正如我已经说过的那样。

答案 1 :(得分:6)

这非常令人沮丧。 Django的序列化抱怨所有不是查询集的东西,json.dumps抱怨Django的ORM支持对象。

>>> from cluster.models import Account
>>> import json
>>> json.dumps(Account.objects.all()[0])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Account: 9de5-2653-000d-81a3 => foo@bar.net> is not JSON serializable

对战

>>> serializers.serialize("json", [clusters])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize
    s.serialize(queryset, **options)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/base.py", line 41, in serialize
    for field in obj._meta.local_fields:
AttributeError: 'QuerySet' object has no attribute '_meta'

答案 2 :(得分:4)

正如Vinay指出的那样,即使你转向列表,序列化仍然会失败。对我来说,序列化在DateTimeField元素(datetime.datetime对象)上失败,即使我要求ValuesQuerySet(类似列表)与.values()。对我来说解决方案是一个简单的理解。

json.dumps([str(obj) for obj in Model.objects.values()]);

在你的情况下,那将是

return json.dumps({k: str(v) for k, v in self.__dict__.items()})

str的神奇之处在于拯救了这一天。如果序列化中需要对象类型信息,repr内置函数也可能会有所帮助。