【问题标题】:ValueError: No JSON object could be decoded reading from fileValueError:无法从文件中解码读取任何 JSON 对象
【发布时间】:2016-01-09 23:43:56
【问题描述】:

我正在尝试将 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:不知何故,问题自行解决了。

【问题讨论】:

标签: python json python-3.2


【解决方案1】:

以下代码已经过测试,可以与您问题中提供的 whole JSON file 完美配合。

工作示例 - 使用 Python 2.6.92.7.10 测试> 和 3.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

【讨论】:

  • 我已经尝试过了,不幸的是它也没有用。 .load() 无论如何都会自动为您读取文件,所以这无关紧要。 .loads() 更适合解析网页的响应。
  • @paul-clavier 我刚刚编辑并测试了我的代码以反映您提到的内容,并在全新安装的 Python 3.2.5 上运行它,它与所有其他版本的工作方式相同我已经用它测试过了。看来您的 json 库副本可能已损坏/损坏,或者您的 Python 安装可能有问题。
  • @paul-clavier 您能否提供您正在使用的 Python 3.2 的确切发行版本? 3.2.0 或 3.2.1 或 3.2.2 或 3.2.3 或 3.2.4 或 3.2.5 或 3.2.6 ?您可以使用以下行 import sys; print('.'.join(map(str, sys.version_info[0:3]))) 获取您的 Python 版本
  • @PaulClavier,您是否尝试过我建议使用json.loads(multiline_text_variable) 的最后一个测试来检查是您的文件加载失败,还是实际的 json 库失败?
【解决方案2】:

使用 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 模块有一些问题。

【讨论】:

  • 不,在 Python 3.2 领域仍然没有工作。我在记事本中将文件保存为 UTF-8,将编码设置为 UTF-8 和 UTF-8-SIG,并尝试仅输入一个条目,但仍然出现相同的错误。
  • @PaulClavier,尝试我的更新中描述的内联测试
  • @PaulClavier,我使用新编译的 Python 3.2.6 进行了测试,但无法生成错误。您正在运行哪个版本的 Python,以及在哪个操作系统下运行?
  • 内联测试通过
  • @PaulClavier,如果内联测试通过,则文件读取存在问题。您是否尝试过读取文件,并且只在每一行上打印?
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多