我可以在 FastAPI 的 JSON 响应中返回单个反斜杠吗? [重复]

问题描述 投票:0回答:2

似乎是一个非常简单的问题,目前尚不清楚正确答案是什么。

我们知道反斜杠是 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"

关于是否可以返回单个斜杠的实际建议将非常有帮助。

python json python-3.x fastapi backslash
2个回答
0
投票

根据 FastAPI 文档

默认情况下,FastAPI 会自动将该返回值转换为

JSON
使用
JSON 兼容中解释的 
jsonable_encoder 编码器.

然后,在幕后,它会将 JSON 兼容的数据(例如 a

dict
) 位于
JSONResponse
内,用于发送 对客户的回应。

因此,为了避免转换(序列化)为

JSON
(这会导致反斜杠加倍),您可以改为 返回自定义
Response
。根据文档(上面提到的链接):

当你直接返回一个

Response
时,它的数据没有经过验证, 转换(序列化),也不会自动记录。

Response
bytes
参数中接受
string
对象或
bytes
(FastAPI 在幕后编码为
content
),如文档 herehere(来自 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

-1
投票

好的,现在问完已经找到答案了。就是这个:

https://stackoverflow.com/a/49763737/163567

是的,这是不可能的——设计使然。

JSON 解析器本质上应该只发出有效的 JSON。来自 RFC 8259,我的重点是:

  1. 弦乐

字符串的表示类似于 C 系列编程语言中使用的约定。字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。

任何字符都可以被转义。如果该字符位于基本多语言平面(U+0000 到 U+FFFF)中,则它可以表示为一个六字符序列:反斜线,后跟小写字母 u,后跟四个十六进制数字,这些数字编码字符的代码点。十六进制字母 A 到 F 可以是大写或小写。因此,例如,仅包含单个反斜线字符的字符串可以表示为“\u005C”。

或者,还有一些流行字符的两个字符序列转义表示。因此,例如,仅包含单个反斜线字符的字符串可以更紧凑地表示为“\”。

注意短语“必须转义”——“必须”是一个正式定义的艺术术语;不符合 JSON 规范中的 MUST 要求的东西不允许称为 JSON。

总而言之:数据中仅包含文字反斜杠的字符串可能会在 JSON 中编码为“\u005c”或“\”。它可能不会被编码为“”(包括该字符作为未转义的文字)。

© www.soinside.com 2019 - 2024. All rights reserved.