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

时间:2018-04-10 21:53:33

标签: python json escaping special-characters

我正在为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对象。

1 个答案:

答案 0 :(得分:2)

是的, 是不可能的 - 按设计。

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

  

7。字符串

     

字符串的表示类似于C中使用的约定      编程语言家族。字符串的开头和结尾      引号。所有Unicode字符都可以放在      引号,除了必须转义的字符:      引号,反向固定,和控制字符(U + 0000      通过U + 001F)。

     

任何角色都可能被转义。如果角色在基本      多语言平面(U + 0000到U + FFFF),然后它可能是      表示为六个字符的序列:反向固相,然后      用小写字母u,后跟四个十六进制数字      编码角色的代码点。十六进制字母A到      F可以是大写或小写。 所以,例如,一个字符串      可以表示仅包含单个反向固相字符      作为“\ u005C”。

     

或者,有两个字符的序列转义      一些流行角色的表现形式。 所以,例如,a      只包含一个反向固相字符的字符串可能是      更紧凑地表示为"\\"

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

总结:数据中只包含文字反斜杠的字符串可以用JSON编码为"\u005c""\\"。它可能不会被编码为"\"(包括该字符作为未转义的文字)。