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)
我的问题:
json.load()
自动转义\n
?\\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)
归档时间: |
|
查看次数: |
5480 次 |
最近记录: |