解析json响应以获取父/子字典

2024-10-02 00:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个json列表(最初是来自TestRail API getcases的响应),我正试图解析它。下面是一个json示例:

[
{
    "id": 1,
    "parent_id": null,
},
{
    "id": 2,
    "parent_id": 1,
},
{
    "id": 6,
    "parent_id": null,
},
{
    "id": 16,
    "parent_id": 2,
},
{
    "id": 7,
    "parent_id": 1,
},
{
    "id": 3,
    "parent_id": 6
}
]

我要做的是找出哪些ID属于原始父ID。 例如,id:1和{}是自"parent_id": null以来最顶级的父节点。在

我想让所有的子节点都在最上面的父节点之下。 在这个例子中,这里是基于parent_id的关系

1->;[2,7]->;16

6->;3

主要目标是确定顶级父节点的所有子节点(和子子节点)是什么。我不想知道子代父子关系。在

我要分析的是得到以下输出:

^{pr2}$

一种方法是使用两个嵌套的for循环,对于每个顶级父节点,检查它是否以parent_id的形式出现,然后递归地执行,但这看起来不是一个很好的方法。在

如有任何意见/建议,将不胜感激


Tags: 方法gtapiidjson示例列表节点
1条回答
网友
1楼 · 发布于 2024-10-02 00:28:45
import json

from collections import defaultdict

data = json.loads(
    '[{"id": 1, "parent_id": null}, {"id": 2, "parent_id": 1}, {"id": 6, "parent_id": null}, {"id": 16, "parent_id": 2}, {"id": 7, "parent_id": 1}, {"id": 3, "parent_id": 6}]')

parents = {d['id']: d['parent_id'] for d in data}

class RootsDict(dict):
    def __missing__(self, key):
        parent = parents[key]
        if parent is None:
            return key
        else:
            return self[parent]

roots_dict = RootsDict()
descendants = defaultdict(list)

for d in data:
    id_ = d['id']
    if d['parent_id'] is not None:
        descendants[roots_dict[id_]].append(id_)

print(descendants)  # {1: [2, 16, 7], 6: [3]}

roots_dict的设计使得roots_dict[node]将返回node的顶层父级,或者{}本身(如果它已经是根)。__missing__是一种可以为dict重写的特殊方法。当从dict请求key但不存在时,调用它。无论方法返回什么,都将以该值放入dict中。例如,当第一次被访问时,roots_dict[16]将被设置为等于roots_dict[2],这反过来又会要求roots_dict[1],这就是1。其余的都很简单。在

相关问题 更多 >

    热门问题