python递归查询菜单并转换成json实例

对于这个问题,我们来逐步分析。

一、递归查询菜单

假设我们有如下的菜单数据:

[
    {"id": 1, "name": "菜单1", "parent_id": None},
    {"id": 2, "name": "菜单2", "parent_id": None},
    {"id": 3, "name": "菜单3", "parent_id": 1},
    {"id": 4, "name": "菜单4", "parent_id": 1},
    {"id": 5, "name": "菜单5", "parent_id": 2},
    {"id": 6, "name": "菜单6", "parent_id": 4},
    {"id": 7, "name": "菜单7", "parent_id": 6},
    {"id": 8, "name": "菜单8", "parent_id": 5}
]

通过递归查询菜单,我们希望得到以下结果:

菜单1
├── 菜单3
└── 菜单4
    └── 菜单6
        └── 菜单7
菜单2
└── 菜单5
    └── 菜单8

我们可以使用如下的 Python 代码来实现递归查询菜单:

def get_menu_children(menu, parent_id=None):
    children = []
    for item in menu:
        if item['parent_id'] == parent_id:
            item_children = get_menu_children(menu, item['id'])
            if item_children:
                item['children'] = item_children
            children.append(item)
    return children

在上述代码中,我们通过遍历菜单,将所有 parent_id 为指定值的项目作为当前 item 的子菜单添加进去。由于可能存在多层子菜单,因此对所有子菜单也递归调用这个函数,直到找到所有子菜单。

示例代码:

menu_data = [
    {"id": 1, "name": "菜单1", "parent_id": None},
    {"id": 2, "name": "菜单2", "parent_id": None},
    {"id": 3, "name": "菜单3", "parent_id": 1},
    {"id": 4, "name": "菜单4", "parent_id": 1},
    {"id": 5, "name": "菜单5", "parent_id": 2},
    {"id": 6, "name": "菜单6", "parent_id": 4},
    {"id": 7, "name": "菜单7", "parent_id": 6},
    {"id": 8, "name": "菜单8", "parent_id": 5}
]

menu_tree = get_menu_children(menu_data)
for item in menu_tree:
    print(item['name'])
    if 'children' in item:
        for child in item['children']:
            print("  ├──", child['name'])
            if 'children' in child:
                for sub_child in child['children']:
                    print("  │   └──", sub_child['name'])

二、转换成Json实例

接下来,我们把上述菜单数据转换成 Json 实例。转换过程如下:

def menu_to_json(menu):
    res = []
    for item in menu:
        res.append({
            "id": item['id'],
            "name": item['name'],
        })
        if 'children' in item:
            res[-1]['children'] = menu_to_json(item['children'])
    return res

在上述代码中,我们通过遍历菜单,把每个 item 转化为 Json 语法,包含 idname,并根据是否含有子菜单来判断是否要添加 children 项。

这样,我们就得到了如下的 Json 实例:

[
    {
        "id":1,
        "name":"菜单1",
        "children":[
            {
                "id":3,
                "name":"菜单3"
            },
            {
                "id":4,
                "name":"菜单4",
                "children":[
                    {
                        "id":6,
                        "name":"菜单6",
                        "children":[
                            {
                                "id":7,
                                "name":"菜单7"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "id":2,
        "name":"菜单2",
        "children":[
            {
                "id":5,
                "name":"菜单5",
                "children":[
                    {
                        "id":8,
                        "name":"菜单8"
                    }
                ]
            }
        ]
    }
]

另外,我们可以把 Python 字典转换成 Json,如下所示:

import json

menu_dict = menu_to_json(menu_data)
menu_json = json.dumps(menu_dict, ensure_ascii=False, indent=4)
print(menu_json)

输出结果:

[
    {
        "id": 1,
        "name": "菜单1",
        "children": [
            {
                "id": 3,
                "name": "菜单3"
            },
            {
                "id": 4,
                "name": "菜单4",
                "children": [
                    {
                        "id": 6,
                        "name": "菜单6",
                        "children": [
                            {
                                "id": 7,
                                "name": "菜单7"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "id": 2,
        "name": "菜单2",
        "children": [
            {
                "id": 5,
                "name": "菜单5",
                "children": [
                    {
                        "id": 8,
                        "name": "菜单8"
                    }
                ]
            }
        ]
    }
]

三、示例说明

以上就是 Python 递归查询菜单并转换成 Json 实例的代码实现过程。下面提供两个示例。

示例1

假设我们需要从一个有多层嵌套的分类树中取出一条分类链上的所有分类节点及其所有的子节点,并按照节点在分类层级链中的顺序,转换成 Json,如下所示:

category_data = [
    {"id": 1, "name": "电器", "parent_id": None},
    {"id": 2, "name": "手机", "parent_id": 1},
    {"id": 3, "name": "笔记本电脑", "parent_id": 1},
    {"id": 4, "name": "智能电视", "parent_id": 1},
    {"id": 5, "name": "苹果", "parent_id": 2},
    {"id": 6, "name": "三星", "parent_id": 2},
    {"id": 7, "name": "戴尔", "parent_id": 3},
    {"id": 8, "name": "联想", "parent_id": 3},
    {"id": 9, "name": "小米", "parent_id": 2},
    {"id": 10, "name": "夏普", "parent_id": 4}
]

def get_category_chain(category, chain=None):
    if chain is None:
        chain = []
    chain.insert(0, {"id": category["id"], "name": category["name"]})
    if category["parent_id"]:
        parent_category = next((item for item in category_data if item["id"] == category["parent_id"]), None)
        if parent_category:
            get_category_chain(parent_category, chain)
    return chain

category_id = 8
category = next((item for item in category_data if item["id"] == category_id), None)
category_chain = get_category_chain(category)

category_dict = [menu_to_json(category_chain)]
print(json.dumps(category_dict, ensure_ascii=False, indent=4))

输出结果:

[
    [
        {
            "id": 1,
            "name": "电器",
            "children": [
                {
                    "id": 3,
                    "name": "笔记本电脑",
                    "children": [
                        {
                            "id": 7,
                            "name": "戴尔"
                        },
                        {
                            "id": 8,
                            "name": "联想"
                        }
                    ]
                },
                {
                    "id": 4,
                    "name": "智能电视",
                    "children": [
                        {
                            "id": 10,
                            "name": "夏普"
                        }
                    ]
                },
                {
                    "id": 2,
                    "name": "手机",
                    "children": [
                        {
                            "id": 5,
                            "name": "苹果"
                        },
                        {
                            "id": 9,
                            "name": "小米"
                        },
                        {
                            "id": 6,
                            "name": "三星"
                        }
                    ]
                }
            ]
        },
        {
            "id": 3,
            "name": "笔记本电脑",
            "children": [
                {
                    "id": 7,
                    "name": "戴尔"
                },
                {
                    "id": 8,
                    "name": "联想"
                }
            ]
        },
        {
            "id": 8,
            "name": "联想"
        }
    ]
]

示例2

假设我们有一个课程目录,包含多个课程分类和课程。我们需要按照分类的结构,把课程目录转换成树形结构,并转换成 Json 数据,输出到文件中。示例如下:

class_item_data = [
    {"id": 1, "name": "课程分类1", "parent_id": None},
    {"id": 2, "name": "课程1", "parent_id": 1},
    {"id": 3, "name": "课程2", "parent_id": 1},
    {"id": 4, "name": "课程分类2", "parent_id": None},
    {"id": 5, "name": "课程3", "parent_id": 4},
    {"id": 6, "name": "课程分类1-1", "parent_id": 1},
    {"id": 7, "name": "课程4", "parent_id": 6},
    {"id": 8, "name": "课程分类1-2", "parent_id": 1},
    {"id": 9, "name": "课程5", "parent_id": 8},
    {"id": 10, "name": "课程分类2-1", "parent_id": 4},
    {"id": 11, "name": "课程6", "parent_id": 10},
    {"id": 12, "name": "课程分类2-2", "parent_id": 4},
    {"id": 13, "name": "课程7", "parent_id": 12}
]

class_item_tree = get_menu_children(class_item_data)

class_dict = menu_to_json(class_item_tree)
with open("class_tree.json", 'w', encoding='utf-8') as f:
    f.write(json.dumps(class_dict, ensure_ascii=False, indent=4))

输出结果:使用任意的 JSON 解析工具打开class_tree.json可以看到详细的JSON结构体现了实际的树形结构。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python递归查询菜单并转换成json实例 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 如何将 Pandas 系列转换为 Python 列表

    将 Pandas 数据结构转换为 Python 标准数据结构的操作是非常重要的,因为它允许你在 Pandas 和其他 Python 库之间自由地进行数据交换和操作。 在 Pandas 中,Series 是一种带有标签的一维数组,可以将 Pandas Series 数据结构转换为列表,可以使用 pandas.Series.values 属性或 tolist()…

    python-answer 2023年3月27日
    00
  • 10分钟快速入门Pandas库

    10分钟快速入门Pandas库 Pandas是Python中一个强大的数据分析库,它能够轻松地处理和分析大量的数据。在这篇文章中,我们将探索如何在10分钟内快速入门Pandas库。 安装Pandas 在开始之前,我们需要确保Pandas库已经被安装在我们的本地机器上。可以使用下面的命令进行安装: pip install pandas 导入Pandas库 安装…

    python 2023年5月14日
    00
  • Python Pandas 中的数据结构详解

    Python Pandas 中的数据结构详解 什么是 Pandas Pandas 是一个强大、灵活、高效的数据分析工具,尤其是在处理大型数据集时,Pandas 的表现十分出色。它主要用于处理带标签的数组(Series)和表格(DataFrame)数据,完美地结合了 NumPy 和 SQL 功能,为数据分析提供了诸多易用的函数和方法。 Pandas 中的两种主…

    python 2023年5月14日
    00
  • Pandas – 合并两个具有不同列的数据框架

    当我们需要整合不同数据源、不同数据集时,常常需要进行数据框架间的合并。在Pandas中,通过merge()函数可以较为方便地实现数据框架间的合并。在两个具有不同列的数据框架合并时,我们需要注意以下几个方面: 合并键:在两个数据框架合并的过程中,我们需要指定合并键。合并键可以是某一个或某几个相同的标识符,将数据框架按照这个标识符进行合并。在指定合并键时,需要注…

    python-answer 2023年3月27日
    00
  • Python Pandas pandas.read_sql函数实例用法

    Python Pandas pandas.read_sql函数实例用法 简介 pandas.read_sql函数是pandas库的一个功能强大的读取SQL查询结果的函数。通过这个函数,可以轻松地将SQL语句查询结果转换为pandas DataFrame(数据框)形式,方便进一步地数据处理与分析。 基本语法 pandas.read_sql(sql, con, …

    python 2023年5月14日
    00
  • Pandas解析JSON数据集

    当我们需要处理JSON格式的数据时,一种非常常见且方便的方式就是通过Pandas将JSON数据转换成DataFrame对象。Pandas可以解析包含嵌套和非嵌套结构的JSON数据集,并且在转换数据时向DataFrame对象中添加metadata信息,使转换过程可控。下面是Pandas解析JSON数据的详细步骤: 通过Python的json库读取JSON文件或…

    python-answer 2023年3月27日
    00
  • 浅谈四种快速易用的Python数据可视化方法

    浅谈四种快速易用的Python数据可视化方法 数据可视化在数据分析中扮演着非常重要的角色。Python提供了多种数据可视化工具,其中比较流行的有Matplotlib、Seaborn、Plotly和Bokeh。本篇文章将介绍这四种Python数据可视化工具的基本用法。 Matplotlib Matplotlib是Python中最常用的数据可视化工具。它支持各种…

    python 2023年5月14日
    00
  • Python机器学习三大件之二pandas

    Python机器学习三大件之二pandas 一、Pandas Pandas是一个强大的数据分析库,它广泛应用于数据清洗、数据分析、数据可视化等领域。它是Python机器学习三大件之一。在数据分析过程中,我们常常需要做数据清洗、处理缺失值、合并数据、分组聚合、时间序列处理等各种操作,而Pandas可以帮助我们更加高效地完成这些操作。Pandas主要提供了两种数…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部