json 转储转义字符

Jor*_*dan 5 python json python-2.7

我在转义字符和 json.dumps 方面遇到了一些问题。

每当调用 json.dumps 时,似乎都会添加额外的转义字符。例子:

not_encoded = {'data': '''!"#$%'()*+,-/:;=?@[\]^_`{|}~0000&<>'''}
print(not_encoded)
{'data': '!"#$%\'()*+,-/:;=?@[\\]^_`{|}~0000&<>'}
Run Code Online (Sandbox Code Playgroud)

这很好,但是当我进行 json 转储时,它会添加很多额外的值。

json.dumps(not_encoded)
'{"data": "!\\"#$%\'()*+,-/:;=?@[\\\\]^_`{|}~0000&<>"}'
Run Code Online (Sandbox Code Playgroud)

转储不应该是这个样子。它是双重转义 \ 和 "。任何人都知道这是为什么以及如何修复它?我希望 json.dumps 输出

'{"data": "!\"#$%'()*+,-/:;=?@[\\]^_`{|}~0000&<>"}'
Run Code Online (Sandbox Code Playgroud)

编辑

加载回转储中:

the_dump = json.dumps(not_encoded)
json.loads(the_dump)
{u'data': u'!"#$%\'()*+,-/:;=?@[\\]^_`{|}~0000&<>'}
Run Code Online (Sandbox Code Playgroud)

问题是我正在访问一个需要这些特殊字符的 API 端点,但当 json.dumps 添加额外的转义字符 (\\\\\\") 时,它会超出字符限制。

Chr*_*isD 7

值得阅读一下python 中print,str和之间的区别(例如,请参见此处)。您正在将打印的原始字符串与 json 编码的 repr 进行比较,后者将有双重转义 - 一种来自 json 编码,另一种来自 python 的字符串表示形式。repr

不过其他方面都没有问题,对比一下len(not_encoded['data'])就会len(json.loads(json.dumps(not_encoded))['data'])发现都是一样的。没有多余的字符,但有不同的显示方法。