>>> import json
>>> d2 = json.loads(open("t.json").read())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.6/json/decoder.py", line 336, in raw_decode
obj, end = self._scanner.iterscan(s, **kw).next()
File "/usr/lib64/python2.6/json/scanner.py", line 55, in iterscan
rval, next_pos = action(m, context)
File "/usr/lib64/python2.6/json/decoder.py", line 185, in JSONObject
raise ValueError(errmsg("Expecting object", s, end))
ValueError: Expecting object: line 1 column 11 (char 11)
[ RHEL - ~/testing ]$ cat t.json
{"us": u"OFF", "val": u"5"}
以下是我在JSON文件中的内容,当我尝试使用open
和json.load
以及json.loads读取它时,它失败了。
使用json.load后
>>> import json
>>> d2 = json.load(open("t.json"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/json/__init__.py", line 267, in load
parse_constant=parse_constant, **kw)
File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.6/json/decoder.py", line 336, in raw_decode
obj, end = self._scanner.iterscan(s, **kw).next()
File "/usr/lib64/python2.6/json/scanner.py", line 55, in iterscan
rval, next_pos = action(m, context)
File "/usr/lib64/python2.6/json/decoder.py", line 185, in JSONObject
raise ValueError(errmsg("Expecting object", s, end))
ValueError: Expecting object: line 1 column 11 (char 11)
>>>
答案 0 :(得分:2)
您使用的功能错误。使用json.load()
(无s
!)从打开的文件对象加载数据:
d2 = json.load(open("t.json"))
json.loads()
函数希望您传入字符串,而不是文件对象。在这种情况下,您必须读取文件,并返回读取数据:
d2 = json.loads(open("t.json").read())
接下来,该文件中包含无效的JSON:
{"us": u"OFF", "val": u"5"}
# ^ ^
JSON不是Python;不支持也不需要那些u
前缀。在加载之前,您需要从文件中删除它们。
如果你有一个产生这种格式的API,它就不会给你JSON。可能是它正在生成一种(奇怪形式的)Python语法; Python本身会产生{'us': u'OFF', 'val': u'5'}
(单引号)。您可以让Python将其解释为带有ast.literal_eval()
的Python文字:
import ast
with open('t.json') as fileobj:
d2 = ast.literal_eval(fileobj.read())
但可能是我们无法通过单个隔离样本确定的其他方式破坏格式。它可以使用true
和false
作为布尔值,例如在JSON中。
最好修复 API ,而不是尝试解决这个问题。
答案 1 :(得分:0)
您正在使用json.loads
方法。更多文档here。此方法仅用于字符串参数。幸运的是,这里记录了一个类似命名的json.load
方法。这个可以直接在文件对象上使用。
d2 = json.load(open("t.json"))
答案 2 :(得分:0)
您的问题是JSON无效。
它看起来像是一个python dictionnary。 u'string'
是一个python 2 unicode字符串。
如果从字符串中删除u
,则可以正常使用。
>>> import json
>>> json.load(open('i.json'))
{u'val': u'5', u'us': u'OFF'}
这是json文件:
$ cat i.json
{"us": "OFF", "val": "5"}