serialized - python return json
Django: "TypeError:[] no es serializable por JSON" ¿Por qué? (3)
Como señaló Vinay, incluso si se lanza a una lista, la serialización a menudo aún falla. Para mí, la serialización falla en los elementos de DateTimeField ( datetime.datetime
objects), incluso si solicito un ValuesQuerySet
( ValuesQuerySet
una lista) con .values()
. La solución para mí fue una comprensión simple.
json.dumps([str(obj) for obj in Model.objects.values()]);
En tu caso, eso sería
return json.dumps({k: str(v) for k, v in self.__dict__.items()})
La magia de str
salva el día. La repr
built-in también puede ser útil si necesita información de tipo de objeto en su serialización.
¿Cómo puede ser que se haya presentado este error? Ingresé esto:
def json(self):
return json.dumps(
{
''items'': self.items
}
)
y obtuve ese error (porque self.items era un queryset vacío (Django)
pero entonces,
def json(self):
return json.dumps(
{
''items'': [] # Pass in empty list to prove that the error was idiotic.
}
)
funcionó bien (lo que al menos prueba que el mensaje de error no tiene valor)
¿Esto es porque el conjunto de preguntas define repr () y devuelve ''[]'' como una cadena cuando está vacía o algo ridículo como ese?
Esto es muy frustrante La serialización de Django se queja de todo lo que no es un conjunto de consultas y json.dumps se queja de los objetos del soporte ORM de 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 => [email protected]> is not JSON serializable
Versus
>>> 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''
Los conjuntos de consulta no son serializables listos para usar. Si prueba list(self.items)
lugar de solo self.items
, eso debería funcionar siempre que los elementos en sí mismos sean serializables por JSON.
Actualización: generará una excepción incluso si no está vacía. No creo que sea aceptado como un error de Django, aunque por supuesto puedes intentarlo; la respuesta más simple es forzar la evaluación usando la list(qs)
, como ya he dicho.