Django: «Ошибка типа: [] не поддерживает сериализацию в формате JSON» Почему? - PullRequest
35 голосов
/ 11 февраля 2010

Как это может быть, чтобы эта ошибка возникла? Я ввел это:

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 ]

59 голосов
/ 11 февраля 2010

Querysets не сериализуются из коробки. Если вы попробуете list(self.items) вместо self.items, это сработает, если сами элементы сериализуются в JSON.

Обновление: Возникнет исключение, даже если оно не пустое. Я не думаю, что это будет воспринято как ошибка Django, хотя, конечно, вы можете попробовать; самый простой ответ - форсировать оценку, используя list(qs), как я уже сказал.

6 голосов
/ 17 марта 2012

Это очень расстраивает. Сериализация Django жалуется на все, что не является набором запросов, а json.dumps жалуется на объекты из поддержки ORM Django.

>>> 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'
4 голосов
/ 01 февраля 2013

Как указывал Винай, даже если вы преобразуете в список, сериализация часто все равно не срабатывает. Для меня сериализация завершается неудачно для элементов 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 также может быть полезен, если вам нужна информация о типе объекта при сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...