programing

JSON 시리얼화 불가

stoneblock 2023. 3. 25. 09:14

JSON 시리얼화 불가

다음과 같은 List View가 있습니다.

import json
class CountryListView(ListView):
     model = Country

    def render_to_response(self, context, **response_kwargs):

         return json.dumps(self.get_queryset().values_list('code', flat=True))

그러나 다음과 같은 오류가 표시됩니다.

[u'ae', u'ag', u'ai', u'al', u'am', 
u'ao', u'ar', u'at', u'au', u'aw', 
u'az', u'ba', u'bb', u'bd', u'be', u'bg', 
u'bh', u'bl', u'bm', u'bn', '...(remaining elements truncated)...'] 
is not JSON serializable

좋은 생각 있어요?

메서드는 실제로 목록을 반환하는 것이 아니라 유형의 개체를 반환한다는 점에 유의해야 합니다.django.db.models.query.ValuesListQuerySetDjango의 느린 평가 목표를 유지하기 위해, 즉 '목록'을 생성하는 데 필요한 DB 쿼리는 개체가 평가될 때까지 실제로 수행되지 않습니다.

하지만 좀 짜증나게도 이 물건에는__repr__출력할 때 목록처럼 보이도록 하는 방법이기 때문에 개체가 목록이 아닌 것이 항상 명확하지는 않습니다.

질문의 예외는 사용자 지정 개체를 JSON에서 직렬화할 수 없기 때문에 먼저 목록으로 변환해야 합니다.

my_list = list(self.get_queryset().values_list('code', flat=True))

...그러면 JSON으로 변환할 수 있습니다.

json_data = json.dumps(my_list)

또한 결과 JSON 데이터는HttpResponse오브젝트, 그것은 분명히, 그것이 있어야 한다.Content-Typeapplication/json, 다음과 같이...

response = HttpResponse(json_data, content_type='application/json')

...기능에서 복귀할 수 있습니다.

class CountryListView(ListView):
     model = Country

    def render_to_response(self, context, **response_kwargs):

         return HttpResponse(json.dumps(list(self.get_queryset().values_list('code', flat=True))),mimetype="application/json") 

문제를 해결하다

mimtype도 중요합니다.

언급URL : https://stackoverflow.com/questions/16336271/is-not-json-serializable