Django: «TypeError: не является сериализуемым 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. } ) 

(что, по крайней мере, доказывает, что сообщение об ошибке бесполезно)

Это потому, что queryset определяет repr () и возвращает '[]' как строку, когда она пуста или что-то смешное?

3 Solutions collect form web for “Django: «TypeError: не является сериализуемым JSON« Почему?”

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

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

Это очень расстраивает. Сериализация 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' 

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

  • PySpark sqlContext JSON запрашивает все значения массива
  • pandas read_csv с последним столбцом, содержащим запятые
  • Одинарные и двойные кавычки в JSON
  • Как я могу разобрать JSON в Google App Engine?
  • Возвращение массива JSON из представления Django в шаблон
  • Как преобразовать результат Pandas DataFrame в пользовательский формат json
  • Сбрасывание нескольких переменных на диск в Json. Одна переменная на строку
  • Попробуйте прочитать json-файл с помощью python
  • Python - лучший язык программирования в мире.