为什么 json.loads('{"Testing": "This quo\\"te String"}')) 不起作用?

Why doesn't json.loads('{"Testing": "This quo\\\\"te String"}')) work?

我想了解为什么下面的代码在 Python 中不起作用:

import json

s = json.loads(' {"Testing" : "This quo\\"te String"} ')

print(s)

理论上我应该取回的是{'Testing' : 'This quo\"te String'}.

这些工作正常:

print(json.loads(' {"Testing" : "This quo\"te String"} ')) ----> {'Testing' : 'This quo"te String'}

print(json.loads(' {"Testing" :"This quo\\\"te String"}')) ----> {'Testing' : 'This quo\"te String'}

我猜这与字典中有一个 \" 的特质有关,但无法弄清楚到底发生了什么。

您的 python 字符串中需要奇数 对反斜杠 才能得到奇数 反斜杠 在 json 中。然后每对反斜杠变成一个反斜杠,您还需要一个(奇数个)来转义引号。

字符串This quo\"te String在正常Python中需要两次转义:一次用于\,一次用于",总共三个反斜杠:

>>> print("This quo\\"te String")
This quo\"te String

对于json,所有这些反斜杠必须自己转义,因为该字符串嵌入在另一个字符串中。因此,总共需要六个反斜杠:

>>> print(json.loads('"This quo\\\"te String"'))
This quo\"te String

但是,如果使用raw-strings,则不需要额外的转义:

>>> print(json.loads(r'"This quo\\"te String"'))
This quo\"te String

在您的第一个示例中,四个反斜杠将被解析为单个文字 \(即作为转义反斜杠),而 " 未转义。

请注意,如果字符串在 dict 中,则没有区别 - 结果将完全相同:

>>> dct = json.loads('{"Testing": "This quo\\\"te String"}')
>>> print(dct['Testing'])
This quo\"te String