在python中读取JSON文件时出现问题

时间:2015-03-12 13:27:08

标签: python json

>>> 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文件中的内容,当我尝试使用openjson.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)
>>>

3 个答案:

答案 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())

但可能是我们无法通过单个隔离样本确定的其他方式破坏格式。它可以使用truefalse作为布尔值,例如在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"}