【问题标题】:Object of type 'TypeError' is not JSON serializable“TypeError”类型的对象不是 JSON 可序列化的
【发布时间】:2018-03-28 14:23:31
【问题描述】:

我尝试使用 Django rest 框架构建 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)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 输入127.0.0.1:8000/api/news 时出现错误“'NoneType' 对象不可下标”,但输入127.0.0.1:8000/api/news/1 时可以获取数据如何从127.0.0.1:8000/api/news 获取完整数据
    • @Ray 尝试使用return Response(result, status=status.HTTP_200_OK) 而不是return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)
    【解决方案2】:

    第一

    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】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-11
        • 2019-11-21
        • 2021-11-13
        • 2018-09-22
        • 2019-01-17
        • 2019-12-07
        • 2023-01-20
        • 2017-09-05
        相关资源
        最近更新 更多