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

现有如下需求,构造分层次的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>

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('山东省','临沂市','莒南县','老仆镇')

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; }
}
}

根据各个层次的划分,我们的各个 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() > )
{
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;
}
}

前端调用代码如下:

        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);
}

得到的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": "老仆镇"
}
]
}
]
}
]
}
]

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

@陈卧龙的博客

如何构造分层次的 Json 数据的更多相关文章

  1. 如何构造树状 JSON 数据 JSON-Tree

    十年河东,十年河西,莫欺骚年穷...打错一个字哈.~_~ 接着上一篇博客,上一篇博客是=使用数据库结合LINQ构造的,为了方便理解,本篇采用泛型分组进行构造. 有兴趣的小虎斑可以参考上一篇博客:如何构 ...

  2. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  3. Java构造和解析Json数据的两种方法详解一

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...

  4. 反面教材 构造构造 json 数据

    构造构造 json 数据 说说你们在项目中遇到过的最糟糕的代码 - V2EX https://www.v2ex.com/t/214099

  5. 自己构造用于异步请求的JSON数据

    有时候.serialize()或者.serializeJSON()莫名其妙的不能按照我们的要求将数据序列化. 或者其他什么问题然我们需要自己惊醒JSON数据的构造.因为js对JSON的支持做的比较好, ...

  6. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  7. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  8. ajax 请求json数据中json对象的构造获取问题

    前端的界面中,我想通过ajax来调用写好的json数据,并调用add(data)方法进行解析,请求如下: json数据如下: { “type”:"qqq", "lat&q ...

  9. Salesforce Apex 使用JSON数据的示例程序

    本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...

随机推荐

  1. Linux原理总结 。。。更新中

    问题: 1.32位和64位Linux系统的区别是什么? 答:64位系统CPU运行速度快,支持更大的内存,能够更好的发挥服务器硬件的性能,提高业务效率 2.描述Linux分区的知识(包括设备名.主分区. ...

  2. 腾讯云部署golang flow流程,vue.js+nginx+mysql+node.js

    这次总算把js-ojus/flow的ui部署到腾讯云上,比较吐槽的就是,为啥这么复杂,vue.js前后端分离,比golang编写的部署方面复杂几万倍.真是浪费人生啊. golang+sqlite写的东 ...

  3. java中传值方式的个人理解

    前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客. 值传递 值传递是指在调用函数时将实际参数复制一 ...

  4. datagridview 行高列宽的自动设置

    1) 设定行高和列宽自动调整 [C#]// 设定包括Header和所有单元格的列宽自动调整 DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSi ...

  5. 恢复已删除ibdata1

    最近我有一个客户删除InnoDB主表空间 - ibdata1 - 和重做日志 - ib_logfile *的情况. MySQL使InnoDB文件始终保持打开状态.以下恢复技术基于此事实,它允许抢救数据 ...

  6. 用Python实现数据结构之二叉搜索树

    二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...

  7. 代理ARP--善意的欺骗

    1. 代理ARP(Proxy ARP)是什么? 顾名思义,它指通过中间设备(通常为Router)代替其他主机响应ARP请求.对于没有配置默认网关的主机想要与其他网络的另一台主机通信时,网关收到源主机的 ...

  8. .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)

    Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...

  9. 说说Android6.0动态申请权限的那些坑

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...

  10. window下上传文件至linux(windows下如何访问linux)

    ========相信我,按照步骤来一定能成功====== 我将从三个方面来说明:为什么要搭建访问服务器.如何搭建访问服务器.windows如下访问 为什么要搭建访问Linux服务器 我们都知道,服务器 ...