为什么 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
我想了解为什么下面的代码在 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