Python读取多行JSON

14 投票
3 回答
25657 浏览
提问于 2025-04-15 23:11

我一直在尝试用JSON来存储程序的设置。但是,我发现Python 2.6的JSON解码器无法解码多行的JSON字符串...

这是一个示例输入:

.settings file:
"""
{\
  'user':'username',\
  'password':'passwd',\
}\
"""

我尝试了几种其他的文件语法,下面会具体说明(以及它们引发的错误信息)。

我用来读取文件的Python代码是:

import json
settings_text = open(".settings", "r").read()
settings = json.loads(settings_text)

这个过程的错误信息是:

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    print json.loads(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 322, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 1 column 2 - line 7 column 1 (char 2 - 41)

我猜测“额外数据”是指三重引号。

以下是我尝试过的其他.settings文件的语法,以及它们各自的错误信息:

"{\
  'user':'username',\
  'pass':'passwd'\
}"

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    print json.loads(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 336, in raw_decode
    obj, end = self._scanner.iterscan(s, **kw).next()
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/scanner.py", line 55, in iterscan
    rval, next_pos = action(m, context)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 155, in JSONString
    return scanstring(match.string, match.end(), encoding, strict)
ValueError: Invalid \escape: line 1 column 2 (char 2)



'{\
  "user":"username",\
  "pass":"passwd",\
}'

Traceback (most recent call last):
  File "json_test.py", line 4, in <module>
    print json.loads(text)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 338, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

如果我把所有设置放在一行上,它就能正常解码。

3 个回答

-5

试着使用 eval(s)

s=""" {\ 'user':'用户名',\ 'password':'密码',\ \ """

ss=eval(q)

qq {'密码': 'passwd', '用户': '用户名'}

type(qq) 字典

3
>>> s = """
{
  "user":"username",
  "password":"passwd"
}
"""
>>> json.loads(s)
{'password': 'passwd', 'user': 'username'}

在json中,\这个符号并不被当作换行符使用。

18

把设置文件里的所有反斜杠和那些“Python风格”的引号都去掉。只要文件内容是这样的就可以正常工作:

{
  "user":"username",
  "password":"passwd"
}

另外要注意,JSON字符串是用双引号包起来的,而不是单引号。你可以在这里查看JSON的规范:

http://www.json.org/

撰写回答