簡體   English   中英

如何創建遞歸 JSON 層次結構樹?

[英]How to creating recursive JSON hierarchy tree?

您可以看到父級的名稱是顏色以 child_id 0 開頭,子級是紅色和藍色,將 id 與顏色綁定。

我想把表里的數據弄成Json怎么辦?

在此處輸入圖像描述

我的數據

import pandas as pd

data = {
    'id': ['2', '13', '14', '15'],
    'name': ['color', 'red', 'blue', 'ruby red'],
    'child_id': ['0', '2', '2', '13']
}
  

df = pd.DataFrame(data)
df

預計 Output

[
    {
        "name": "color",
        "id": 2,
        "child_id": 0,
        "children": [
            {
                "name": "red",
                "id": 13,
                "child_id": 2,
                "children": [
                    {
                        "name": "ruby red",
                        "id": 15,
                        "child_id": 13,
                    }
                ]
            },
            {
                "name": "blue",
                "id": 14,
                "child_id": 2
            }
        ]
    }
]

將其視為一棵樹並在字典上應用簡單的遍歷,字典是由df.to_dict()從 df 轉換而來的。 添加了類型注釋。 希望你能理解。

from dataclasses import dataclass, field, asdict
from pprint import pprint
from typing import List, Dict, Optional
import pandas as pd
from pandas import DataFrame


@dataclass
class Tree:
    name: str
    id: int
    child_id: int
    children: List['Tree'] = field(default_factory=list)


def traversal(df: DataFrame) -> Optional[Tree]:
    tmp: List[Tree] = [Tree(name=i["name"], id=int(i["id"]), child_id=int(i["child_id"])) for i in df.to_dict("records")]
    memo: Dict[int, Tree] = {i.id: i for i in tmp}
    root = None
    for i in tmp:
        if i.child_id == 0:
            root = i
        else:
            memo[i.child_id].children.append(i)
    return root


if __name__ == '__main__':
    data = {
        'id': ['2', '13', '14', '15'],
        'name': ['color', 'red', 'blue', 'ruby red'],
        'child_id': ['0', '2', '2', '13']
    }
    dataframe = pd.DataFrame(data)
    res = traversal(dataframe)
    if res:
        pprint([asdict(res)])
    else:
        print("err")

Output:

[{'child_id': 0,
  'children': [{'child_id': 2,
                'children': [{'child_id': 13,
                              'children': [],
                              'id': 15,
                              'name': 'ruby red'}],
                'id': 13,
                'name': 'red'},
               {'child_id': 2, 'children': [], 'id': 14, 'name': 'blue'}],
  'id': 2,
  'name': 'color'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM