Python:在 json.load() vs json.loads() 中处理换行符



根据这个答案,JSON 字符串中的换行符应始终进行转义。当我使用json.load()加载 JSON 时,这似乎不是必需的。

我已将以下字符串保存到文件中:

{'text': 'Hello,n How are you?'}

使用json.load()加载 JSON 不会引发异常,即使未转义n也是如此:

>>> with open('test.json', 'r') as f:
...   json.load(f)
...
{'text': 'Hello,n How are you?'}

但是,如果我使用json.loads(),我会得到一个异常:

>>> s
'{"text": "Hello,n How are you?"}'
>>> json.loads(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:Python34libjson__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "c:Python34libjsondecoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:Python34libjsondecoder.py", line 359, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 17 (char 16)

我的问题:

  1. json.load()是否会自动转义文件对象内的n
  2. 无论 JSON 是由json.load()还是json.loads()读取,是否应该始终执行\n
json.load()

从文件描述符读取,json.loads()从字符串读取。

在您的文件中,n被正确编码为换行符,并且不会在字符串中显示为两个字符,而是显示为您知道的正确空白字符。

但是在字符串中,如果您不对\n进行双重转义,则加载器会认为它是一个控制字符。但是换行符不是 JSON 的控制序列(换行符实际上与其他任何字符一样(。

通过加倍反斜杠,您实际上会得到一个包含n的真正字符串,只有这样 Python 才会将n转换为换行符。

编辑:这里已经回答了:https://stackoverflow.com/a/16544933/1054458

也许strict选项可以提供帮助:

test.py:

import json
s = '''{
"asdf":"foo
bar"
}'''
print(json.loads(s, strict=False)["asdf"])

输出:

$> python test.py
foo
bar

这里的错误是: 当您使用记事本打开文本文件时,它显示:

{'text': 'Hello,n How are you?'}
">

\"和"n"是单独的字符,与此文件中的任何其他字符一样。

在python程序中,你写:

s='{"text": "Hello,n How are you?"}'

做一个测试:

>>> s[15]
','
>>> s[16]
'n'
>>> s[17]
' '

不要错过最有趣的部分:这里的 是一个字符,在 s[16] 中,这意味着 ASCII=10,一个控制字符。

此控制字符表示回车或换行符。无论如何,由于存在此控制字符,因此无法将其加载为JSON对象。

你实际上必须写

s='{"text": "Hello,\n How are you?"}'

使其与文本文件中完全相同。

最新更新