Как получить данные от родителя / ребенка Heirarchal json в python? - PullRequest
3 голосов
/ 16 апреля 2020

У меня есть вызов API, который возвращает мне следующий ответ. Я изо всех сил пытаюсь работать с ним и получить доступ ко всем детям, так как все дети также могут быть родителями.

Ответ поступает в следующей иерархии:

[
{
   "id": 459029874,
   "name": "Data",
   "children": []
},
{
  "id":762606928,
  "name":"Top 25 KPIs",
  "children":[
    {
      "id":97002306,
      "name":"KPI Definition",
      "children":[]
    },
    {
      "id":1178185669,
      "name":"DEU",
      "children":[
        {
          "id":146196511,
          "name":"DEU Development Path",
          "children":[]
        }
      ]
    }
  ]
}]

Я пытаюсь получить следующий результат и затем поместить его в кадр данных:

{"id": 459029874, "name": "Data", "parent_id": ""},
{"id": 762606928, "name": "Top 25 KPIs", "parent_id": ""},
{"id": 97002306, "name": "KPI Definition", "parent_id": "762606928"},
{"id": 1178185669, "name": "DEU", "parent_id": "762606928"},
{"id": 146196511, "name": "DEU Development Path", "parent_id": "1178185669"}

и и так далее ...

1 Ответ

2 голосов
/ 16 апреля 2020

С такими проблемами удобно создавать генератор, который yield с результатами, а затем yields from потомками, рекурсивно передавая потомков обратно в генератор. Это делает для очень кратких решений:

def flatten(l, parent = ''):
    for item in l:
        yield {'id': item['id'], 'name': item['name'], "parent_id": parent }
        yield from flatten(item['children'], item['id'])

list(flatten(data))

Результат:

[{'id': 459029874, 'name': 'Data', 'parent_id': ''},
 {'id': 762606928, 'name': 'Top 25 KPIs', 'parent_id': ''},
 {'id': 97002306, 'name': 'KPI Definition', 'parent_id': 762606928},
 {'id': 1178185669, 'name': 'DEU', 'parent_id': 762606928},
 {'id': 146196511, 'name': 'DEU Development Path', 'parent_id': 1178185669}]
...