为啥从 django rest 框架返回的 JSON 在响应中有正斜杠?

Posted

技术标签:

【中文标题】为啥从 django rest 框架返回的 JSON 在响应中有正斜杠?【英文标题】:Why does JSON returned from the django rest framework have forward slashes in the response?为什么从 django rest 框架返回的 JSON 在响应中有正斜杠? 【发布时间】:2015-03-30 17:33:32 【问题描述】:

我的响应码

from rest_framework.response import Response
import json
responseData =  'success' : True 
return Response(json.dumps(responseData))

它在执行curl 或通过浏览器访问响应时的显示方式。

"\"success\": true"

为什么是正斜杠?如何删除它们?

【问题讨论】:

这是双重编码的 JSON;编码 JSON 对象的 JSON 字符串。你确定你没有任何其他编码响应再次 我使用的 Response 函数是由 django rest 框架实现的。 【参考方案1】:

您将数据呈现为 JSON 两次。删除您的 json.dumps() 电话。

来自Django REST documentation:

与常规的 HttpResponse 对象不同,您不会使用呈现的内容来实例化 Response 对象。 您传入未渲染的数据,这些数据可能包含任何 Python 原语。

然后,Django REST 框架会为您生成 JSON。既然你给了它一个字符串,那个字符串是 JSON 编码的再次

>>> import json
>>> responseData =  'success' : True 
>>> print json.dumps(responseData)
"success": true
>>> print json.dumps(json.dumps(responseData))
"\"success\": true"

框架使用Content Negotiation来决定使用什么序列化格式;这样,您的 API 客户端也可以请求将数据编码为 YAML 或 XML,例如。

另见Responses documentation:

REST 框架通过提供 Response 类支持 HTTP 内容协商,该类允许您返回可呈现为多种内容类型的内容,具体取决于客户端请求。

【讨论】:

以上是关于为啥从 django rest 框架返回的 JSON 在响应中有正斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

为啥通过 django rest 框架注册用户时出现状态码错误

Django:从 Pandas 到 Django Rest 框架的模型查询集

Django rest框架:如何全局更改错误响应格式

为啥我在 POST 到 Django REST 框架时得到“CSRF cookie not set”?

尝试覆盖django rest框架中的update方法,以在更新后返回整个查询集

Django Rest Framework - 为啥在尝试使用不正确的凭据登录用户时返回 200 状态码?