如何构造分层次的 Json 数据

简介: 十年河东,十年河西,莫欺骚年穷...打错个字~_~现有如下需求,构造分层次的Json数据,层次结构类似下图:上图使用EasyUI生成的,静态HTML如下: 测试 body { ...

十年河东,十年河西,莫欺骚年穷...打错个字~_~

现有如下需求,构造分层次的Json数据,层次结构类似下图:

上图使用EasyUI生成的,静态HTML如下:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
    <title>测试</title>
    <link href="/jquery-easyui-1.3.0/themes/default/easyui.css" rel="stylesheet" type="text/css" />
    <link href="/jquery-easyui-1.3.0/themes/default/easyui.css" rel="stylesheet" />
    <script src="/jquery-easyui-1.3.0/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script src="/jquery-easyui-1.3.0/jquery.easyui.min.js" type="text/javascript"></script>
    <link href="/jquery-easyui-1.3.0/themes/icon.css" rel="stylesheet" type="text/css" />
    <style type="text/css">
        body {
            font: 12px/20px "微软雅黑", "宋体", Arial, sans-serif, Verdana, Tahoma;
            padding: 0;
            margin: 0;
        }

        a:link {
            text-decoration: none;
        }

        a:visited {
            text-decoration: none;
        }

        a:hover {
            text-decoration: underline;
        }

        a:active {
            text-decoration: none;
        }

        .cs-north {
            height: 60px;
            background: #B3DFDA;
        }

        .cs-north-bg {
            width: 100%;
            height: 100%;
            background: url(~/jquery-easyui-1.3.0/themes/gray/images/header_bg.png) repeat-x;
        }

        .cs-north-logo {
            height: 40px;
            padding: 15px 0px 0px 5px;
            color: #fff;
            font-size: 22px;
            font-weight: bold;
            text-decoration: none;
        }

        .cs-west {
            width: 200px;
            padding: 0px;
            border-left: 1px solid #99BBE8;
        }

        .cs-south {
            height: 25px;
            background: url('~/jquery-easyui-1.3.0/themes/gray/images/panel_title.gif') repeat-x;
            padding: 0px;
            text-align: center;
        }

        .cs-navi-tab {
            padding: 5px;
        }

        .cs-tab-menu {
            width: 120px;
        }

        .cs-home-remark {
            padding: 10px;
        }
        /*以下为自定义样式,用于表单验证*/
        .warn {
            border-color: #f78d8d !important;
            outline: 0 !important;
            -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgb(239, 154, 154) !important;
            box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(239, 154, 154) !important;
        }

        .error {
            color: red;
            font-size: small;
        }
    </style>

    <style type="text/css">
        .tree li {
            margin-top: 4px;
        }
    </style>
</head>
<body>
    <ul class="easyui-tree" id="Ul1" style="padding-left: 5px;">
        <li>
            <span>河南省</span>
            <ul>

                <li data-options="state:'open'">
                    <span>商丘市</span>
                    <ul>
                        <li data-options="state:'open'">
                            <span>永城市</span>
                            <ul>
                                <li>
                                    <span>
                                        <label>薛湖镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>芒山镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>陈集镇</label>
                                    </span>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
                 <li data-options="state:'open'">
                    <span>洛阳市</span>
                    <ul>
                        <li data-options="state:'open'">
                            <span>伊川县</span>
                            <ul>
                                <li>
                                    <span>
                                        <label>太平镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>大留镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>小庙镇</label>
                                    </span>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>

         <li>
            <span>江苏省</span>
            <ul>

                <li data-options="state:'open'">
                    <span>苏州市</span>
                    <ul>
                        <li data-options="state:'open'">
                            <span>张家港市</span>
                            <ul>
                                <li>
                                    <span>
                                        <label>乐余镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>锦丰镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>兆丰镇</label>
                                    </span>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
                 <li data-options="state:'open'">
                    <span>常熟市</span>
                    <ul>
                        <li data-options="state:'open'">
                            <span>长袖市</span>
                            <ul>
                                <li>
                                    <span>
                                        <label>平镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>留镇</label>
                                    </span>
                                </li>
                                 <li>
                                    <span>
                                        <label>庙镇</label>
                                    </span>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</body>
</html>
View Code

HTML代码仅供惨了,我们的重点的构造类似上图的JSON数据包。如何构造呢?

本篇利用LINQ结合数据库来构造这个JSON数据。

数据库部分如下:

create table HelloChina
(
Id int identity(1,1) primary key,
Province nvarchar(50),--
City  nvarchar(50),--市/区
District nvarchar(50),--县/区
OrgName nvarchar(50),--
AddTime datetime default(getdate()) 
)

insert into HelloChina(Province,City,District,OrgName) values('河南省','商丘市','永城市','薛湖镇')
insert into HelloChina(Province,City,District,OrgName) values('河南省','商丘市','永城市','陈集镇')
insert into HelloChina(Province,City,District,OrgName) values('河南省','商丘市','永城市','芒山镇')

insert into HelloChina(Province,City,District,OrgName) values('河南省','洛阳市','伊川县','太平镇')
insert into HelloChina(Province,City,District,OrgName) values('河南省','洛阳市','伊川县','大留镇')
insert into HelloChina(Province,City,District,OrgName) values('河南省','洛阳市','伊川县','小庙镇')
insert into HelloChina(Province,City,District,OrgName) values('河南省','平顶山市','鲁山县','炉山镇')
insert into HelloChina(Province,City,District,OrgName) values('河南省','平顶山市','平川市','大茂镇')

insert into HelloChina(Province,City,District,OrgName) values('江苏省','苏州市','张家港市','大学镇')
insert into HelloChina(Province,City,District,OrgName) values('江苏省','苏州市','常熟市','小雪镇')
insert into HelloChina(Province,City,District,OrgName) values('江苏省','南京市','南水市','高中镇')
insert into HelloChina(Province,City,District,OrgName) values('江苏省','南京市','吴中市','初中镇')

insert into HelloChina(Province,City,District,OrgName) values('安徽省','合肥市','肥水县','沸水镇')
insert into HelloChina(Province,City,District,OrgName) values('安徽省','合肥市','肥水县','肥牛镇')
insert into HelloChina(Province,City,District,OrgName) values('安徽省','南京市','京东县','羊羔镇')

insert into HelloChina(Province,City,District,OrgName) values('山东省','临沂市','莒南县','老仆镇')
View Code

C#实体Model如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AnBang.Model
{
    public class BureauMenuModel_P
    {
        public string Province { get; set; }
        public List<BureauMenuModel_C> nodes { get; set; }
    }

    public class BureauMenuModel_C
    {
        public string City { get; set; }
        public List<BureauMenuModel_D> nodes { get; set; }
    }

    public class BureauMenuModel_D
    {

        public string District { get; set; }
        public List<BureauMenuModel_O> nodes { get; set; }
    }

    public class BureauMenuModel_O
    {
        public string OrgName { get; set; }
    }

    public class ResultModel
    {
        public List<BureauMenuModel_P> Json { get; set; }
        public string GroupName { get; set; }
    }

    public partial class HelloChinaModel
    {
        public int Id { get; set; }
        public string Province { get; set; }
        public string City { get; set; }
        public string District { get; set; }
        public string OrgName { get; set; }
        public Nullable<System.DateTime> AddTime { get; set; }
    }
}
View Code

根据各个层次的划分,我们的各个 Model 之间也一定要存在这种层次关系!

下面就是具体的实现:

思路分析:依次分组划分,然后依次构造。

时间不多,不作讲解,代码如下:

        public BaseResponse<ResultModel> GetJson()
        {
            using (AnbSosCustomerEntities context = new AnbSosCustomerEntities())
            {
                BaseResponse<ResultModel> response = new BaseResponse<ResultModel>();
                List<BureauMenuModel_P> MenuModelList = new List<BureauMenuModel_P>();
                //
                List<HelloChinaModel> MList = new List<HelloChinaModel>();
                var Hello = context.HelloChina;
                var Query = from Org in Hello
                            select Org;
                if (Query.Count() > 0)
                {
                    var data = Query.ToList();

                    MList = Mapper.DynamicMap<List<HelloChinaModel>>(data);
                }
                //根据省份 分组
                var P_ls = MList.GroupBy(a => a.Province).Select(g => (new { Province = g.Key, Citys = g })).ToList();
                foreach (var item in P_ls)
                {
                    BureauMenuModel_P P = new BureauMenuModel_P();
                    P.Province = item.Province;
                    P.nodes = new List<BureauMenuModel_C>();
                    var CityList = item.Citys.GroupBy(a => a.City).Select(g => new { City = g.Key, Districts = g }).ToList();
                    foreach (var CItem in CityList)
                    {
                        BureauMenuModel_C C = new BureauMenuModel_C();
                        C.City = CItem.City;
                        C.nodes = new List<BureauMenuModel_D>();
                        var Districts = CItem.Districts.GroupBy(a => a.District).Select(g => new { District = g.Key, Orgs = g }).ToList();
                        foreach (var DistrictItem in Districts)
                        {
                            BureauMenuModel_D D = new BureauMenuModel_D();
                            D.nodes = new List<BureauMenuModel_O>();
                            D.District = DistrictItem.District;
                            C.nodes = new List<BureauMenuModel_D>();
                            var orgs = DistrictItem.Orgs.ToList();
                            foreach (var org in orgs)
                            {
                                BureauMenuModel_O O = new BureauMenuModel_O();
                                O.OrgName = org.OrgName;
                                D.nodes.Add(O);

                            }
                            C.nodes.Add(D);
                        }
                        P.nodes.Add(C);
                    }
                    MenuModelList.Add(P);

                }

                //string Json = JsonConvert.SerializeObject(MenuModelList); ;
                response.Data = new ResultModel();
                response.Data.Json = MenuModelList;
                return response;
            }
        }
View Code

前端调用代码如下:

        IBase Implement = new BaseImplement();
        protected void Page_Load(object sender, EventArgs e)
        {
            List<BureauMenuModel_P> MenuModelList = new List<BureauMenuModel_P>();
            if (Implement.GetJson().Data.Json != null)
            {
                MenuModelList = Implement.GetJson().Data.Json;
            }
            string Json = JsonConvert.SerializeObject(MenuModelList );
            Response.Write(Json);
        }
View Code

得到的JSON数据如下:

[
    {
        "Province": "河南省",
        "nodes": [
            {
                "City": "商丘市",
                "nodes": [
                    {
                        "District": "永城市",
                        "nodes": [
                            {
                                "OrgName": "薛湖镇"
                            },
                            {
                                "OrgName": "陈集镇"
                            },
                            {
                                "OrgName": "芒山镇"
                            }
                        ]
                    }
                ]
            },
            {
                "City": "洛阳市",
                "nodes": [
                    {
                        "District": "伊川县",
                        "nodes": [
                            {
                                "OrgName": "太平镇"
                            },
                            {
                                "OrgName": "大留镇"
                            },
                            {
                                "OrgName": "小庙镇"
                            }
                        ]
                    }
                ]
            },
            {
                "City": "平顶山市",
                "nodes": [
                    {
                        "District": "平川市",
                        "nodes": [
                            {
                                "OrgName": "大茂镇"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "Province": "江苏省",
        "nodes": [
            {
                "City": "苏州市",
                "nodes": [
                    {
                        "District": "常熟市",
                        "nodes": [
                            {
                                "OrgName": "小雪镇"
                            }
                        ]
                    }
                ]
            },
            {
                "City": "南京市",
                "nodes": [
                    {
                        "District": "吴中市",
                        "nodes": [
                            {
                                "OrgName": "初中镇"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "Province": "安徽省",
        "nodes": [
            {
                "City": "合肥市",
                "nodes": [
                    {
                        "District": "肥水县",
                        "nodes": [
                            {
                                "OrgName": "沸水镇"
                            },
                            {
                                "OrgName": "肥牛镇"
                            }
                        ]
                    }
                ]
            },
            {
                "City": "南京市",
                "nodes": [
                    {
                        "District": "京东县",
                        "nodes": [
                            {
                                "OrgName": "羊羔镇"
                            }
                        ]
                    }
                ]
            }
        ]
    },
    {
        "Province": "山东省",
        "nodes": [
            {
                "City": "临沂市",
                "nodes": [
                    {
                        "District": "莒南县",
                        "nodes": [
                            {
                                "OrgName": "老仆镇"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

有人会问我,安徽省为什么有个南京市,我想说:数据库数据我是随便写的,不要介意哦!

@陈卧龙的博客

目录
打赏
0
0
0
0
4
分享
相关文章
淘宝商品评论API接口,json数据示例参考
淘宝开放平台提供了多种API接口来获取商品评论数据,其中taobao.item.reviews.get是一个常用的接口,用于获取指定商品的评论信息。以下是关于该接口的详细介绍和使用方法:
SPL 处理多层 JSON 数据比 DuckDB 方便多了
esProc SPL 处理多层 JSON 数据比 DuckDB 更便捷,尤其在保留 JSON 层次与复杂计算时优势明显。DuckDB 虽能通过 `read_json_auto()` 将 JSON 解析为表格结构,但面对深层次或复杂运算时,SQL 需频繁使用 UNNEST、子查询等结构,逻辑易变得繁琐。而 SPL 以集合运算方式直接处理子表,代码更简洁直观,无需复杂关联或 Lambda 语法,同时保持 JSON 原始结构。esProc SPL 开源免费,适合复杂 JSON 场景,欢迎至乾学院探索!
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
123 67
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
配置Nginx根据IP地址进行流量限制以及返回JSON格式数据的方案
最后,记得在任何生产环境部署之前,进行透彻测试以确保一切运转如预期。遵循这些战术,守卫你的网络城堡不再是难题。
66 3
如何在 Postman 中上传文件和 JSON 数据
如果你想在 Postman 中同时上传文件和 JSON 数据,本文将带你一步一步地了解整个过程,包括最佳实践和技巧,让你的工作更轻松。
如何在 Postman 中发送 JSON 数据
我们将深入探讨使用 Postman 发送 JSON 数据这一主题,Postman 是一款强大的 API 测试和开发工具。无论您是经验丰富的开发人员还是新手,掌握这项技能对于高效的 API 测试和开发都至关重要。
怎样用 esProc 计算来自 Restful 的多层 json 数据
esProc 是一款强大的数据处理工具,可简化 Java 处理 Restful 接口返回的复杂多层 JSON 数据的难题。通过 esProc,不仅能轻松访问和解析 Restful 数据,还能高效完成复杂计算任务,并可无缝嵌入 Java 应用中作为计算引擎使用。例如,筛选特定分类订单或计算金额,esProc 的脚本简洁直观,远优于传统 SQL 或纯 Java 实现。此外,esProc 支持安全认证(如 Cookie 和 Token)及 JDBC 集成,为开发者提供灵活高效的解决方案。
何如定义 JSON Schema 并验证该 json 数据?
本文定义了一个包含 audio 和 tags 两个必需属性的 JSON Schema,用于规范数据结构。其中,audio 是非空字符串,表示音频组件;tags 是非空数组,表示标签组件。通过示例数据和验证工具(如 ajv, NJsonSchema),可确保 JSON 数据符合 Schema 要求,从而保障数据的一致性和正确性。
124 1
淘宝商品详情API接口概述与JSON数据示例
淘宝商品详情API是淘宝开放平台提供的核心接口之一,为开发者提供了获取商品深度信息的能力。以下是技术细节和示例:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问