【问题标题】:Read from JSON file with multiple objects in Python在 Python 中从具有多个对象的 JSON 文件中读取
【发布时间】:2020-03-29 08:40:07
【问题描述】:

我对 Python 中的 JSON 库有疑问。我想不出一种从 json 文件中读取数据的方法,如下所示:

{"name": "LOTR", "author": "Tolkin"}{"name": "Aska", "author": "Ivo"}

因为当我尝试使用此代码加载数据时:

    with open("json_books.txt","r") as file:
       json_data = json.load(file)

我收到以下错误:

json.decoder.JSONDecodeError:额外数据:第 1 行第 37 列(字符 36)

我已经查过了,我找到的解决方案都没有帮助我。如果有人能帮我解决这个问题,将不胜感激。

【问题讨论】:

  • 我认为这不是有效的 JSON。您能否在输入示例中添加更多详细信息,例如,更多行?
  • 您的 json 文件不包含有效的 json 数据。在解析之前,您必须确保它包含有效的json
  • 您确定您的文件看起来像这样吗?如果是,则无法解析,句号。但是,如果您的文件实际上是多行的,每行一个 JSON 条目(而不是将所有内容混在一起),那么您需要分别解析每一行。你已经知道该怎么做了。

标签: python json file


【解决方案1】:

您可以将文件内容读取为字符串,从JSONDecodeError 异常的错误消息中提取作为索引的“char”数字,并将直到该索引的字符串切片重新解析为有效的JSON ,并以相同的方式解析字符串的其余部分,直到它不再引发错误:

import json
import re
s = '{"name": "LOTR", "author": "Tolkin"}{"name": "Aska", "author": "Ivo"}'
json_data = []
while True:
    try:
        json_data.append(json.loads(s))
        break
    except json.JSONDecodeError as e:
        match = re.match(r'Extra data: .*\(char (\d+)\)', str(e))
        if match:
            index = int(match.group(1))
            json_data.append(json.loads(s[:index]))
            s = s[index:]
        else:
            raise
print(json_data)

这个输出:

[{'name': 'LOTR', 'author': 'Tolkin'}, {'name': 'Aska', 'author': 'Ivo'}]

【讨论】:

    【解决方案2】:

    您列出的不是有效的 JSON。 JSON 在顶层必须有一个列表或对象——这有两个对象。

    也许正确的 JSON 应该是:

    [{"name": "LOTR", "author": "Tolkin"}, {"name": "Aska", "author": "Ivo"}]
    

    【讨论】:

    • 好的,大家说的文件格式不对,我已经修好了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多