장고: "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
'programing' 카테고리의 다른 글
wordpress에서 파일의 로컬 경로를 가져오는 방법 (0) | 2023.03.14 |
---|---|
JPQL에 그런 CASE 표현이 있나요? (0) | 2023.03.14 |
'react-hooks/exhaustive-deps' 규칙에 대한 정의를 찾을 수 없습니다. (0) | 2023.03.14 |
AngularJS에서 사용자가 템플릿/페이지를 떠날 때 어떻게 감지합니까? (0) | 2023.03.14 |
react-select drowdown에서 zIndex를 변경하는 방법 (0) | 2023.03.14 |