从 json 转义单反斜杠和双反斜杠

escaping single and double backslash from json

我正在尝试读取 windows 编码在 json 字符串中的路径。 路径类似于

\sys\tld\a\b\c

以下作品:

import json
json.loads('{"mypath" : "\\b\\a" }')

[Out] {'mypath': '\b\a'}.

但是,我的路径在a

之前没有双反斜杠

以下不起作用(分别为 2 个和 3 个反斜杠):

json.loads('{"mypath" : "\\b\a" }')
JSONDecodeError: Invalid \escape: line 1 column 17 (char 16)


json.loads('{"mypath" : "\\b\\a" }')
JSONDecodeError: Invalid \escape: line 1 column 17 (char 16)


json.loads('{"mypath" : r"\b\a" }')
JSONDecodeError: Expecting value: line 1 column 13 (char 12)

我应该如何编码我的路径 (\sys\tld\a\b\c) 以便从 json 文本文件中正确读取?

问题是在 JSON 字符串文字中,必须转义反斜杠才能生成文字 \。但是,您随后需要转义 Python 字符串文字中的所有 那些 反斜杠,以创建正确的 JSON 字符串值。

>>> json.dumps("\")  # A string consisting of a single backslash
'"\\"'

在您的具体情况下,路径的正确编码版本应该是

>>> json.dumps({'mypath': r'\sys\tld\a\b\c'})
'{"mypath": "\\\\sys\\tld\\a\\b\\c"}'

看起来好像有很多反斜杠,但大部分是str.__repr__为了显示目的添加的,不是实际值的一部分。

>>> print(json.dumps({'mypath': r'\sys\tld\a\b\c'}))
{"mypath": "\\sys\tld\a\b\c"}

原始路径中的每个反斜杠对应 JSON 编码字符串中的两个反斜杠。


使用原始字符串文字可以避免在文字中再次转义每个反斜杠:

>>> '\\sys\tld\a\b\c'
'\\sys\tld\a\b\c'
>>> r'\sys\tld\a\b\c'
'\\sys\tld\a\b\c'

但是,原始字符串文字不能 end 带有反斜杠,这意味着您至少必须依靠字符串文字连接将反斜杠附加到原始字符串文字。

>>> '\foo\'
'\foo\'
>>> r'\foo''\'
'\foo\'

不过,最后,完全避免 Windows 风格的文件路径是最简单的。至少,Python 内置函数如 open 将正确解析 POSIX 风格的路径,即使在 Windows.

上也是如此
# Open \sys\tld\a\b\c
with open('//sys/tld/a/b/c') as f:
    ...