似乎是一个非常简单的问题,目前尚不清楚正确答案是什么。
我们知道反斜杠是 JSON 中的特殊分隔符。
从我们的数据库中,我们返回一个带有反斜杠的字段。出于合同/法律/政府代表的原因,它必须是单个反斜杠。然而,只返回一个反斜杠似乎是不可能的。想知道这是否是 JSON 的规则?可能是这样,但我们三个人花了一天的时间搜索却找不到这里发生的事情。
这是 FastAPI 应用程序:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {
"backslash_1": " \ ",
"backslash_2": " \\ ",
"backslash_3": " \\\ ",
"backslash_4": " \\\\ ",
"backslash_5": " \\\\\ ",
"backslash_6": " \\\\\\ ",
}
这是 JSON 响应:
{
"backslash_1":" \\ ", <-- there are 2
"backslash_2":" \\ ",
"backslash_3":" \\\\ ", <-- there are 4
"backslash_4":" \\\\ ",
"backslash_5":" \\\\\\ ", <-- there are 6
"backslash_6":" \\\\\\ "
}
我们不是谈论python
r''
或repr()
或print
,我们谈论来自API的JSON正文响应。这个问题与 API JSON 主体严格相关,因此这些其他 SO qs 在这里没有用:
我们已经尝试了所有这些,但这对我们的 API 客户端用户来说并没有真正的帮助,因为他们看到 JSON 属性值字符串返回为
"ref\\\\official"
,这是一个错误的响应,因为官方字符串应该是 "ref\official"
。
关于是否可以返回单个斜杠的实际建议将非常有帮助。
根据 FastAPI 文档:
默认情况下,FastAPI 会自动将该返回值转换为
使用JSON
JSON 兼容中解释的jsonable_encoder
编码器.然后,在幕后,它会将 JSON 兼容的数据(例如 a
) 位于dict
内,用于发送 对客户的回应。JSONResponse
因此,为了避免转换(序列化)为
JSON
(这会导致反斜杠加倍),您可以改为 返回自定义 Response
。根据文档(上面提到的链接):
当你直接返回一个
时,它的数据没有经过验证, 转换(序列化),也不会自动记录。Response
Response
在 bytes
参数中接受 string
对象或 bytes
(FastAPI 在幕后编码为 content
),如文档 here 和 here(来自 Starlette 的文档)中所述)。下面的例子:
from fastapi import Response
@app.get("/")
def root():
db_resp = '{"message": " \ "}'
return Response(content=db_resp, status_code=200)
注意: 由于
" \ "
不是有效的 JSON 字符串,因此您不应尝试在客户端反序列化它,因为它不起作用(无论您是否在 media_type="application/json"
中包含 Response
) )。例如,在 Python 请求中,您应该使用 .text
属性而不是 .json()
方法来接收响应:
import requests
r = requests.get(url="http://localhost:8000/")
print(r.text)
#print(r.json()) # this would not work
好的,现在问完已经找到答案了。就是这个:
https://stackoverflow.com/a/49763737/163567
是的,这是不可能的——设计使然。
JSON 解析器本质上应该只发出有效的 JSON。来自 RFC 8259,我的重点是:
- 弦乐
字符串的表示类似于 C 系列编程语言中使用的约定。字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。
任何字符都可以被转义。如果该字符位于基本多语言平面(U+0000 到 U+FFFF)中,则它可以表示为一个六字符序列:反斜线,后跟小写字母 u,后跟四个十六进制数字,这些数字编码字符的代码点。十六进制字母 A 到 F 可以是大写或小写。因此,例如,仅包含单个反斜线字符的字符串可以表示为“\u005C”。
或者,还有一些流行字符的两个字符序列转义表示。因此,例如,仅包含单个反斜线字符的字符串可以更紧凑地表示为“\”。
注意短语“必须转义”——“必须”是一个正式定义的艺术术语;不符合 JSON 规范中的 MUST 要求的东西不允许称为 JSON。
总而言之:数据中仅包含文字反斜杠的字符串可能会在 JSON 中编码为“\u005c”或“\”。它可能不会被编码为“”(包括该字符作为未转义的文字)。