首页 > 解决方案 > 解析不完整的json数组

问题描述

我已经下载了 5MB 的非常大的 json 文件。由此,我需要能够加载 5MB 以生成 json 文件的预览。但是,该文件可能不完整。以下是它的外观示例:

[{
    "first": "bob",
    "address": {
        "street": 13301,
        "zip": 1920
    }
}, {
    "first": "sarah",
    "address": {
        "street": 13301,
        "zip": 1920
    }
}, {"first" : "tom"

从这里开始,我想“重建它”,以便它可以解析前两个对象(并忽略第三个对象)。

是否有一个 json 解析器可以infer或切断字符串的结尾以使其可解析?或者也许要“流式传输”json数组的解析,以便当它在最后一个对象上失败时,我可以退出循环?如果没有,如何实现上述目标?

标签: pythonjsonpython-3.x

解决方案


如果您的数据看起来总是有些相似,您可以执行以下操作:

import json

json_string = """[{
    "first": "bob",
    "address": {
        "street": 13301,
        "zip": 1920
    }
}, {
    "first": "sarah",
    "address": {
        "street": 13301,
        "zip": 1920
    }
}, {"first" : "tom"
"""

while True:
    if not json_string:
        raise ValueError("Couldn't fix JSON")
    try:
        data = json.loads(json_string + "]")
    except json.decoder.JSONDecodeError:
        json_string = json_string[:-1]
        continue
    break

print(data)

这假设数据是字典列表。一步一步地,最后一个字符被删除并]附加一个缺失的字符。如果新字符串可以解释为 JSON,则无限循环中断。否则下一个字符被删除,依此类推。如果没有剩余的字符ValueError("Couldn't fix JSON")被提升。

对于上面的示例,它打印:

[{'first': 'bob', 'address': {'zip': 1920, 'street': 13301}}, {'first': 'sarah', 'address': {'zip': 1920, 'street': 13301}}]

推荐阅读