简体   繁体   中英

Object of type 'TypeError' is not JSON serializable

I try to build API with Django rest framework

And I got Object of

type 'TypeError' is not JSON serializable

What should I do to fix?

Here's my view.py

class NewsViewSet(viewsets.ModelViewSet):
    queryset = News.objects.all()
    serializer_class = NewsSerializer

    def list(self, request, **kwargs):
        try:
            nba = query_nba_by_args(**request.query_params)
            serializer = NewsSerializer(nba['items'], many=True)
            result = dict()
            result['data'] = serializer.data
            result['draw'] = nba['draw']
            result['recordsTotal'] = nba['total']
            result['recordsFiltered'] = nba['count']
            return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)

        except Exception as e:
            return Response(e, status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)

Django cannot convert Exception object to JSON format and raise error. To fix it you should convert error to string and pass result to response:

except Exception as e:
    return Response(str(e), status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)

first

import json
from django.http import HttpResponse

Change line

  return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)

for this

   return HttpResponse(json.dumps(result),content_type="application/json")

or use

 from django.http import JsonResponse

 return JsonResponse(json.dumps(result))

Python exceptions are not json serializable. It's failing in try because of some connection or content unavailable issue, then going into except block where you are passing exception e as it is to Response() so that is creating the issue. Solution - check the URL and also in except block convert exception e to string and pass to Response(str(e), status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM