C# ASP.NET递归循环生成嵌套json结构树
1. 建立用来保存树结构数据的目标对象
public class TreeObject
{
public string name { get; set; }
public string value { get; set; }
public IList<TreeObject> children = new List<TreeObject>();
public void Addchildren(TreeObject node)
{
this.children.Add(node);
}
}
2.查询表获得数据源
/// <summary>
///数据库的连接字符串
/// </summary>
private static readonly string connstr = @"server=.;database=userInfo;uid=sa;pwd=123456";; public DataTable getTable(string cmdText)
{
using (SqlConnection cnn = new SqlConnection(connstr))
{
using (SqlCommand comm = new SqlCommand(cmdText, cnn))
{
comm.CommandType = CommandType.Text;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = comm;
DataTable mytable = new DataTable();
da.Fill(mytable);
return mytable;
}
}
} public DataTable GetDataTable()
{
string sql = @"select ID,NAME_SHORT,BELONGTO_ID
from UserInfo
order by BELONGTO_ID";
DataTable dt = getTable(sql);
return dt;
}
3.递归循环生成树
//全局变量用于保存数据
public List<TreeObject> treeNodes = new List<TreeObject>(); //建立树的递归方法
/// </summary>
/// <param name="dtSource">数据源</param>
/// <param name="parentNode">父节点</param>
/// <param name="parentID">节点的归属ID</param>
public void BindTree(DataTable dtSource, TreeObject parentNode, string parentID)
{
DataRow[] rows = dtSource.Select(string.Format("BELONGTO_ID={0}", parentID));
foreach (DataRow row in rows)
{
TreeObject tree = new TreeObject();
tree.name = row["NAME_SHORT"].ToString();
tree.value = row["ID"].ToString();
//递归性质,函数内调用自身函数
BindTree(dtSource, tree, row["ID"].ToString());
//递归结束的终点条件
if (parentNode == null)
{
treeNodes.Add(tree);
}
else
{
parentNode.children.Add(tree);
}
}
}
4.调用
//调用SQL,获取数据源
DataTable dt = GetDataTable();
//调用递归函数,传入数据源,根节点
BindTree(dt, null, "");
//反序列化对象,生成json字符串
string jsonData = JsonConvert.SerializeObject(treeNodes);
return jsonData;
5.效果
[{
"name": 'A',
"value": '',
"children": [{
"name": 'B1',
"value": '',
"children": [{
"children": [],
"name": 'C',
"value": ''
},
{
"children": [],
"name": 'D',
"value": ''
},
{
"children": [],
"name": 'E',
"value": ''
} ]
},
{
"name": 'B2',
"value": '',
"children": [{
"children": [],
"name": 'F',
"value": ''
},
{
"children": [],
"name": 'G',
"value": ''
}
]
},
{
"name": 'B3',
"value": '',
"children": [{
"children": [],
"name": 'H',
"value": ''
},
{
"children": [],
"name": 'I',
"value": ''
},
{
"children": [],
"name": 'J',
"value": ''
}
]
},
{
"name": 'B4',
"value": '',
"children": [{
"children": [],
"name": 'K',
"value": ''
}, {
"name": 'L',
"value": '',
"children": [{
"children": [],
"name": 'L1',
"value": ''
},
{
"children": [],
"name": 'L2',
"value": ''
}
]
}
]
} ]
}]
C# ASP.NET递归循环生成嵌套json结构树的更多相关文章
- ASP.NET提取多层嵌套json数据的方法
本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...
- 详解ASP.NET提取多层嵌套json数据的方法
本篇文章主要介绍了ASP.NET提取多层嵌套json数据的方法,利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,有兴趣的可以了解一下. 本文实例讲述了ASP.NET利用第三 ...
- 【json/regex】将嵌套对象生成的json文进行内部整形排序后再输出
下载地址:https://files.cnblogs.com/files/xiandedanteng/jsonformat20191126-2.zip 注意:本文仅为draft1版本,还有待完善. 先 ...
- ASP.NET Web API中的JSON和XML序列化
ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...
- 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等
1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
- Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...
- Atitit.json xml 序列化循环引用解决方案json
Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...
- c# 使用递归 循环遍历导航树结构 并解析
1.数据书库结构 1 家用电器 0 一级菜单 2 手机.数码.京东通信 0 一级菜单 3 电脑.办公 0 一级菜单 4 家具.家居.厨房 0 一级菜单 5 男装.女装.童装.内衣 0 一级菜单 6 个 ...
随机推荐
- spring boot+mybatis搭建项目
一.创建spring boot项目 1.File->New->Project 2.选择 Spring Initializr ,然后选择默认的 url 点击[Next]: 3.修改项目信息 ...
- sqlservere小计合计总计
SELECT CASE WHEN GROUPING(F1) = 1 THEN '总计' WHEN GROUPING(F1) = 0 AND GROUPING(F2) = 1 THEN F1+'合计' ...
- 开发一个maven脚手架
写在前面 开发新项目就需要搭建新工程,但是搭建新工程的这个过程是非常繁琐浪费时间的,并且不可避免的需要踩坑.更可怕的是,如果是在一个团队中,每新起一个项目都由不同的开发人员去自定义的搭建工程结构,那么 ...
- ip变动时 wordpress 需要修改一个东西。
搞了大半天,还把mysql 重装了一遍,装的过程中还有这样那样的问题.直到今天总算把网页搞正常了. 主机从6楼搬下来以后,ip就变了.但是很奇怪,用新ip 去访问,能访问,但总觉得很卡的样子.然后会跳 ...
- [Unity UGUI图集系统]浅谈UGUI图集使用
**写在前面,下面是自己做Demo的时候一些记录吧,参考了很多网上分享的资源 一.打图集 1.准备好素材(建议最好是根据图集名称按文件夹分开) 2.创建一个SpriteAtlas 3.将素材添加到图集 ...
- Gym101630L Laminar Family
题目链接:https://cn.vjudge.net/problem/Gym-101630L 题目大意: 对于一个集合的集合,若其中任意两个集合 \(A\) 和 \(B\) 都满足下述三个条件之一:\ ...
- Java流程控制以及顺序、选择、循环结构
目录 用户交互Scanner Scanner对象 hasNext()与next() hasNextLine()与nextLine() Scanner进阶用法 求和与平均数 顺序结构 选择结构 if单选 ...
- 将BeyondCompare设置为TortoiseSVN的扩展比较工具
1)点击鼠标右键 -> 点击TortoiseSVN -> Settings,如下图: 2)选择Diff Viewer - > 选择External(并配置好参数),具体如下图: 3) ...
- CSS3新子代选择器
:nth-child(n) 选择器匹配属于其父元素的第 N 个子元素,不论元素的类型,除了<h>标签. n 可以是数字.关键词或公式 例子一 <!DOCTYPE html> & ...
- linux高级管理第十二章--rsync
实验部分 1.安装rsync 2.配置文件 3.配置密码 4.后续 5.为了测试,创建几个文件 配置实时同步 1.调整inotify内核参数 安装inotify-tools 测试同步 编写脚本 验证 ...