“TypeError”类型的对象不是JSON可序列化的

时间:2018-03-28 14:23:31

标签: python django django-rest-framework restful-url

我尝试使用Django rest framework

构建API

我得到了

的对象
type 'TypeError' is not JSON serializable

我该怎么办?

这是我的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)

4 个答案:

答案 0 :(得分:2)

Django无法将Exception对象转换为JSON格式并引发错误。要修复它,您应该将错误转换为字符串并将结果传递给响应:

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

答案 1 :(得分:0)

如下所示更改您的观点,

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'] if "draw" in nba else None
            result['recordsTotal'] = nba['total'] if "total" in nba else None
            result['recordsFiltered'] = nba['count'] if "count" in nba else None
            return Response(result, status=status.HTTP_200_OK)

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

答案 2 :(得分:0)

首先

import json
from django.http import HttpResponse

更改行

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

这个

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

或使用

 from django.http import JsonResponse

 return JsonResponse(json.dumps(result))

答案 3 :(得分:0)

Python 异常不是 json 可序列化的。 由于某些连接或内容不可用问题,它在 try 中失败,然后进入 except 块,在那里您将异常 e 原样传递给 Response(),从而创建问题。解决方案 - 检查 URL 并在 except 块中将异常 e 转换为字符串并传递给 Response(str(e), status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)