ValueError:没有JSON对象可以解码从文件读取

时间:2015-10-12 13:13:30

标签: python json python-3.2

我试图将JSON文档加载到我的Python代码中。该文件如下:

{
  "FH45 G34": {
    "surname": "Foo",
    "firstName": "Bar",
    "address": "1275 Real Street, FooBar",
    "postCode": "Foo Bar",
    "county": "FooBar"
  },
  ...
}

我尝试使用以下Python代码加载文件:

with open("foobar.json", "r") as foo:
        bar = json.load(foo)

但是我收到以下错误ValueError: No JSON object could be decoded

出了什么问题?

编辑:我无法使用SimpleJSON模块,因为它不适用于Python 3.2,我不习惯使用它。 JSONLint还显示我的JSON有效。

编辑2:整个文件是here

编辑3:不知何故问题已经解决了。

2 个答案:

答案 0 :(得分:0)

使用Python 2.7读取文件时,它会将大多数行转换为unicode字符串,这表明以下更改可能会对Python 3.2世界产生影响:

with open('foobar.json', encoding='utf-8') as foo:
        bar = json.load(foo)
        # or
        bar = json.loads(foo.read())

检测违规行

如果上述方法不起作用,则需要查找违规的json代码。一种方法是删除文件的一半,然后再试一次。如果它仍然失败,那么继续删除一半的文件。

如果有效,请将文件替换为失败部分,然后再次开始删除一半。经过几次尝试后,您将能够找到文件中有问题的部分,或者您是否有基本的读数错误。

要消除阅读错误,您可以尝试在print('file: {}'.format(foo.read()))调用前执行json.loads(),只是为了验证阅读内容。

测试json inline

您可以尝试进一步消除错误源的另一个测试是将一个或几个条目插入到字符串中,并检查它是文件处理还是json处理,它会给您带来错误。类似于以下内容:

json_text= '''
{ "FH45 G34": 
  {
    "surname": "Foo", 
    "firstName": "Bar",
    "address": "1275 Real Street, FooBar", 
    "postCode": "Foo Bar", 
    "county": "FooBar"
  }
}'''

parsed = json.loads(json_text)

您还可以检查是否由于第一个条目的键中的空格而失败。换句话说,从失败的条目中删除空格,主要是在左侧键值。

如果这些测试没问题,那么您的文件读取就会出现问题。如果它们失败,则json模块存在一些问题。

答案 1 :(得分:0)

以下代码已经过测试,可以使用问题中提供的whole JSON file完美运行。

工作示例 - 使用Python 2.6.9 2.7.10 3.2.5 3.3.5 3.5.0

import json

with open('data.json', 'r') as json_data:

    data = json.load(json_data)

    for key, value in data.items():
        print('''
key    {0}

    county       {1}
    surname      {2}
    postCode     {3}
    firstName    {4}
    address      {5}
'''.format(*[key,
             value['county'],
             value['surname'],
             value['postCode'],
             value['firstName'],
             value['address']]))

<强>输出

key    VB95 JGL

    county       FooBar
    surname      Foo
    postCode     Foo Bar
    firstName    Bar
    address      1272 Real Street, FooBar


key    AH63 FIR

    county       FooBar
    surname      Foo
    postCode     Foo Bar
    firstName    Bar
    address      1275 Real Street, FooBar