首页 > 解决方案 > 如何从 Python 中的 JSON 文件生成索引列表?

问题描述

我正在尝试使用 jmespath 操作一个很大的 jsonfile。为此,我需要生成一个完整路径列表以用作参考,因为并非所有项目都需要。

这是一个示例 json:

data = {
    "firstName": "Jane",
    "lastName": "Doe",
    "hobbies": ["running", "sky diving", "singing"],
    "age": 35,
    "children": [
        {
            "firstName": "Alice",
            "age": 6,
            "hobbies": ["swimming", "painting"]
        },
        {
            "firstName": "Bob",
            "age": 8,
            "hobbies": ["video games", "soccer"]
        }
    ]
}

我需要编写脚本来生成:

firstName.Jane
lastName.Doe
hobbies.running
hobbies.sky diving
hobbies.singing
age.35
children[0].firstname.Alice
children[0].age.6
children[0].hobbies.swimming
children[0].hobbies.painting
children[1].firstname.Bob
children[1].age.8
children[1].hobbies.video games
children[1].hobbies.soccer

JSON 的深度可能高达 3-4 级。一直在尝试几种选择,但无法解决如何实现这一目标......

标签: pythonjson

解决方案


这应该适用于任何深度的 JSON(不考虑递归限制):

data = {
    "firstName": "Jane",
    "lastName": "Doe",
    "hobbies": ["running", "sky diving", "singing"],
    "age": 35,
    "children": [
        {
            "firstName": "Alice",
            "age": 6,
            "hobbies": ["swimming", "painting"]
        },
        {
            "firstName": "Bob",
            "age": 8,
            "hobbies": ["video games", "soccer"]
        }
    ]
}

def traverese(d, current_key=''):
    if isinstance(d, dict):
        for k, v in d.items():
            yield from traverese(v, current_key + k + '.')
    elif isinstance(d, list):
        for i, vv in enumerate(d):
            yield from traverese(vv, current_key + '[' + str(i) + '].')
    else:
        yield current_key + str(d)

for index in traverese(data):
    print(index)

印刷:

firstName.Jane
lastName.Doe
hobbies.[0].running
hobbies.[1].sky diving
hobbies.[2].singing
age.35
children.[0].firstName.Alice
children.[0].age.6
children.[0].hobbies.[0].swimming
children.[0].hobbies.[1].painting
children.[1].firstName.Bob
children.[1].age.8
children.[1].hobbies.[0].video games
children.[1].hobbies.[1].soccer

推荐阅读