为啥JSON字符串当中会出现反斜杠?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥JSON字符串当中会出现反斜杠?相关的知识,希望对你有一定的参考价值。

参考技术A 相信很多小伙伴在使用json的过程中,会发现有时候json中会出现反斜杠,是不是很奇怪这个问题?

我使用的fastjson。

通过下面的小例子来看下:

执行结果:

分析:
1)首先我们组装一个map
2)将map进行序列化进行输出,发现没有问题
3)将map进行序列化,再次进行序列化,发现反斜杠出现了

总结:
其实就是我们对map或者对象进行了两次的序列化。说白了就是进行了两次的toJSONString。

为啥反斜杠出现两次?

【中文标题】为啥反斜杠出现两次?【英文标题】:Why do backslashes appear twice?为什么反斜杠出现两次? 【发布时间】:2022-01-17 10:12:25 【问题描述】:

当我创建一个包含反斜杠的字符串时,它们会重复:

>>> my_string = "why\does\it\happen?"
>>> my_string
'why\\does\\it\\happen?'

为什么?

【问题讨论】:

如果您确实有想要删除的反斜杠,请参阅***.com/questions/12618030/… 【参考方案1】:

您所看到的是my_string 由其__repr__() 方法创建的表示。如果你打印它,你可以看到你实际上有一个反斜杠,就像你想要的那样:

>>> print(my_string)
why\does\it\happen?

下面的字符串有三个个字符,而不是四个:

>>> 'a\\b'
'a\\b'
>>> len('a\\b')
3

您可以使用repr() 内置函数获得字符串(或任何其他对象)的标准表示:

>>> print(repr(my_string))
'why\\does\\it\\happen?'

Python 将字符串中的反斜杠表示为 \\,因为反斜杠是转义字符 - 例如,\n 表示换行符,\t 表示制表符。

这有时会给你带来麻烦:

>>> print("this\text\is\not\what\it\seems")
this    ext\is
ot\what\it\seems

因此,需要有一种方法告诉 Python 你真的想要两个字符 \n 而不是换行符,你可以通过转义反斜杠本身来做到这一点,用另一个:

>>> print("this\\text\is\what\you\\need")
this\text\is\what\you\need

当 Python 返回字符串的表示形式时,它会安全地转义所有反斜杠(即使它们不会成为转义序列的一部分),这就是您所看到的。但是,字符串本身只包含一个反斜杠。

有关 Python 字符串文字的更多信息可以在 Python 文档中找到:String and Bytes literals。

【讨论】:

我试图让这个答案特别关注“双反斜杠”的误解,但了解raw string literals 也很有用。【参考方案2】:

正如Zero Piraeus's answer 解释的那样,使用这样的单反斜杠(在raw string literals 之外)是个坏主意。

但是还有一个额外的问题:将来,使用未定义的转义序列(如\d)将是一个错误,而不是意味着文字反斜杠后跟d。因此,与其幸运的是,您的字符串碰巧使用了\d 而不是\t,所以它做了您可能想要的,它绝对不会做您想要的。

从 3.6 开始,it already raises a DeprecationWarning,尽管大多数人看不到这些。 It will become a SyntaxError 在未来的某个版本中。


在包括 C 在内的许多其他语言中,使用不以转义序列开头的反斜杠意味着反斜杠被忽略。

在包括 Python 在内的一些语言中,不以转义序列开头的反斜杠是文字反斜杠。

在某些语言中,为避免混淆该语言是类 C 还是类 Python,并避免出现 \Foo 工作但 \foo 不工作的问题,反斜杠不会启动转义序列是非法的。

【讨论】:

以上是关于为啥JSON字符串当中会出现反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

jquery 冒号转义 为啥双斜杠

如何去掉Json字符串中反斜杠

201709-3 JSON查询

为啥单反斜杠变成双反斜杠

CCF 201709-3 JSON查询

为啥反斜杠出现两次?