繁体   English   中英

ValueError:无法解码JSON对象从文件中读取

[英]ValueError: No JSON object could be decoded reading from file

我正在尝试将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:整个文件在这里

编辑3:以某种方式解决问题本身。

使用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代码。 一种方法是简单地删除一半文件,然后重试。 如果仍然失败,请继续删除一半的文件。

如果可行,请用出现问题的部分替换文件,然后再次开始删除一半。 经过几次尝试,您将能够找到文件的有问题的部分,或者是否有基本的读取错误。

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

测试JSON内联

您可以尝试进一步消除错误源的另一项测试是将一个或几个条目插入字符串中,并检查是文件处理还是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模块有问题。

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

工作示例 —使用Python 2.6.92.7.103.2.53.3.53.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM