遍历嵌套 JSON 的迭代方法?

时间:2021-04-18 16:50:37

标签: python json parsing recursion stack

假设我有以下员工 JSON 文件:

{
    "id": 1,
    "name": "John",
    "team": [
        {
            "id": 22,
            "name": "Jes",
            "team": []
        },
        {
            "id": 24,
            "name": "Jek",
            "team": [
                {
                    "id": 32,
                    "name": "jane",
                    "team": []
                },
                {
                    "id": 6,
                    "name": "Ron",
                    "team": {}
                }
            ]
        }
    ]
}

我想检查 id1 在他的团队中是否有 id 2,问题是我不知道“部门”,因为每个员工都可以有自己的“团队”列表。

我能想到的唯一解决方案是递归搜索 JSON,如下所示:

def find_id(id, data):
    if data['id'] == id:
        return data
    else:
        for emp in data['team']:
            if find_id(id, emp):
                return emp
    return None


def is_bos(id1, id2, data):
    data = find_id(id1, data)
    if data:
        two_found = find_id(id2, data)
        if two_found:
            return True
        return False
    return False

例如以下内容:

is_bos(1, 24, data) # should return true
is_bos(1, 32, data) # should return true
is_bos(32, 6, data) # should return false
is_bos(22, 24, data) # should return false

我想知道有没有更好的方法可以迭代地做到这一点?

1 个答案:

答案 0 :(得分:1)

您始终可以将递归函数转换为迭代函数。在这里,一种简单的技术是使用一个堆栈,您可以在发现团队成员时将其推送到该堆栈上。如果您在途中找到了该物品,请将其归还。如果堆栈为空,您就完成了。

例如:

def find(d, target_id):
    stack = d['team'][:]
    while stack:
        item = stack.pop()
        if item['id'] == target_id:
            return item
        stack.extend(item['team'])
    return -1

find(d, 32)
# {'id': 32, 'name': 'jane', 'team': []}

find(d, 100)
-1

这实质上创建了对树的深度优先搜索。当然,如果您只想要一个布尔值,请返回它而不是最后的 itemFalse