有效的 json 期望转义的换行符编码为“\\n”,带有两个反斜杠。我有包含要保存到文件的换行符的数据。这是一个简化版本:
data = {'mystring': 'Line 1\nLine 2'}
Run Code Online (Sandbox Code Playgroud)
我可以用 json.dumps() 对其进行编码:
import json
json_data = json.dumps(data)
json_data
# -> '{"mystring": "Line 1\\nLine 2"}'
Run Code Online (Sandbox Code Playgroud)
当我打印它时,换行符显示为 '\n',而不是 '\\n'(我觉得很奇怪,但我可以接受):
print(json_data)
# -> {"mystring": "Line 1\nLine 2"}
Run Code Online (Sandbox Code Playgroud)
但是(这是问题所在)当我将其输出到文件时,文件的内容不再包含有效的 json:
f = open('mydata.json', 'w')
f.write(json_data)
f.close()
Run Code Online (Sandbox Code Playgroud)
如果我打开文件并阅读它,它包含以下内容:
{"mystring": "Line 1\nLine 2"}
Run Code Online (Sandbox Code Playgroud)
但我希望这样:
{"mystring": "Line 1\\nLine 2"}
Run Code Online (Sandbox Code Playgroud)
奇怪的是(我认为),如果我使用 python 的 open() 读取文件,json 数据被认为是有效的:
f = open('mydata.json', 'r')
json_data = f.read()
f.close()
json_data
# -> '{"mystring": "Line 1\\nLine 2"}'
Run Code Online (Sandbox Code Playgroud)
...它解码正常:
json.loads(json_data)
# -> {u'mystring': u'Line 1\nLine 2'}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么文件中的数据无效 json?如果我需要另一个 - 非 Python - 应用程序来阅读它,它可能是不正确的。如果我复制并粘贴文件内容并在其上使用 json.loads() 则会失败:
import json
json.loads('{"mystring": "Line 1\nLine 2"}')
# -> ValueError: Invalid control character at: line 1 column 21 (char 20)
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这是预期的行为还是我做错了什么?
您遇到了忽略该\字符也是 Python 中的转义序列字符这一事实的陷阱。尝试打印出最后一个示例而不是调用json.loads:
>>> print('{"mystring": "Line 1\nLine 2"}')
{"mystring": "Line 1
Line 2"}
Run Code Online (Sandbox Code Playgroud)
以上不可能是有效的 JSON。如果\字符编码正确怎么办?
>>> print('{"mystring": "Line 1\\nLine 2"}')
{"mystring": "Line 1\nLine 2"}
Run Code Online (Sandbox Code Playgroud)
更好的是,您可以:
>>> json.loads('{"mystring": "Line 1\\nLine 2"}')
{'mystring': 'Line 1\nLine 2'}
Run Code Online (Sandbox Code Playgroud)
或者,如果您真的很欣赏能够从其他缓冲区复制一些文本并将其粘贴到实时解释器中以进行解码,则可以考虑r对字符串使用aw 修饰符:
>>> print(r'{"mystring": "Line 1\nLine 2"}')
{"mystring": "Line 1\nLine 2"}
>>> json.loads(r'{"mystring": "Line 1\nLine 2"}')
{'mystring': 'Line 1\nLine 2'}
Run Code Online (Sandbox Code Playgroud)
看到\不再使用换行符自动转义。
另请参阅:如何处理 JSON 中的换行符?并注意这不是 Python 中严格存在的问题。
| 归档时间: |
|
| 查看次数: |
16876 次 |
| 最近记录: |