“TypeError”类型的对象不是 JSON 可序列化的
Posted
技术标签:
【中文标题】“TypeError”类型的对象不是 JSON 可序列化的【英文标题】:Object of type 'TypeError' is not JSON serializable 【发布时间】: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)
【问题讨论】:
【参考方案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)
。
【讨论】:
以上是关于“TypeError”类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章
Python 错误:TypeError:'Timestamp' 类型的对象不是 JSON 可序列化的'
TypeError:“标签”类型的对象不是 JSON 可序列化的
TypeError:mappingproxy 类型的对象不是 JSON 可序列化的
TypeError:X 类型的对象不是 JSON 可序列化的