programing

장고: "TypeError: []은(는) JSON을 시리얼화할 수 없습니다."

powerit 2023. 3. 14. 21:57
반응형

장고: "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.
        }
    )

정상적으로 동작했습니다(적어도 에러 메시지가 가치가 없음을 증명합니다).

이는 쿼리셋이 repr()을 정의하고 빈 문자열이나 기타 우스꽝스러운 문자열로 '[]'를 반환하기 때문입니까?

쿼리셋은 즉시 직렬화할 수 없습니다.노력하면list(self.items)뿐만 아니라self.items항목 자체가 JSON 직렬화 가능하면 작동합니다.

업데이트: 비어 있지 않아도 예외가 발생합니다.Django 버그로 받아들여질 것 같지는 않습니다만, 물론 시도해 볼 수 있습니다.가장 간단한 답은 다음과 같은 방법으로 평가를 강제하는 것입니다.list(qs)내가 이미 말했듯.

너무 답답해요.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'

Vinay가 지적한 바와 같이, 리스트에 캐스트 해도, 시리얼화는 실패하는 경우가 많습니다.저는 Date Time Field 요소에서 시리얼화가 실패합니다(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는 시리얼라이제이션에 오브젝트타입 정보가 필요한 경우에도 도움이 됩니다.

언급URL : https://stackoverflow.com/questions/2243002/django-typeerror-is-not-json-serializable-why

반응형