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

Dir*_*uin 8 python json python-3.4

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

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

{'text': 'Hello,\n How are you?'}
Run Code Online (Sandbox Code Playgroud)

加载JSON json.load()并不会引发异常,即使\n没有转义:

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

但是,如果我使用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:\Python34\lib\json\__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "c:\Python34\lib\json\decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\Python34\lib\json\decoder.py", line 359, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 17 (char 16)
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 是否在文件对象内json.load()自动转义\n
  2. 如果一个始终做到\\n无论是否JSON将被读取json.load()json.loads()

Fab*_*ien 10

json.load()从文件描述符json.loads()读取并从字符串中读取.

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

但是在一个字符串中,如果你没有双重转义,\\n那么加载器认为它是一个控制字符.但换行不是JSON的控制序列(换行实际上是一个像任何其他人一样的字符).

通过加倍反斜杠,你实际上会得到一个真正的字符串\n,然后只有Python才会将其\n转换为换行符.


Far*_*arK 10

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

也许这个strict选项可以帮助:

测试.py:

import json

s = '''{
"asdf":"foo
bar"
}'''

print(json.loads(s, strict=False)["asdf"])
Run Code Online (Sandbox Code Playgroud)

输出:

$> python test.py
foo
bar
Run Code Online (Sandbox Code Playgroud)