不可能用单个未转义的反斜杠在Python中存储json

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

我正在为 REST 负载主体创建一个 json 主体,如下所示:

>>> j = json.loads('["foo", {"bar": ["to_be_replaced", 1.1, 1.0, 2]}]')
>>> text = "aaaa" + "\\" + "bbbbb" + "\\" + "cccc"
>>> j[1]["bar"][0] = text
>>> j
['foo', {'bar': ['aaaa\\bbbbb\\cccc', 1.1, 1.0, 2]}]

令人烦恼的是,另一端期望的格式是这样的

"aaaa\bbbb\cccc". 

我知道这是一个糟糕的主意。

我已经尝试了所有方法,并且开始相信在 json 对象中存储这种格式的文本是根本不可能的。有办法吗?或者我是否需要让 Web 服务的开发人员选择一个更合理的分隔符。

我知道这实际上是一个反斜杠,如果我打印,就会得到一个反斜杠

>>> print(text)
aaaa\bbbbb\cccc

但这并不能帮助我将其放入 json 对象中。

python json escaping special-characters
1个回答
5
投票

是的,这不可能的——按照设计。

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

7.弦乐

字符串的表示与 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.