1. 建立用来保存树结构数据的目标对象

  1. public class TreeObject
  2. {
  3. public string name { get; set; }
  4. public string value { get; set; }
  5. public IList<TreeObject> children = new List<TreeObject>();
  6. public void Addchildren(TreeObject node)
  7. {
  8. this.children.Add(node);
  9. }
  10. }

2.查询表获得数据源

  1. /// <summary>
  2. ///数据库的连接字符串
  3. /// </summary>
  4. private static readonly string connstr = @"server=.;database=userInfo;uid=sa;pwd=123456";;
  5.  
  6. public DataTable getTable(string cmdText)
  7. {
  8. using (SqlConnection cnn = new SqlConnection(connstr))
  9. {
  10. using (SqlCommand comm = new SqlCommand(cmdText, cnn))
  11. {
  12. comm.CommandType = CommandType.Text;
  13. SqlDataAdapter da = new SqlDataAdapter();
  14. da.SelectCommand = comm;
  15. DataTable mytable = new DataTable();
  16. da.Fill(mytable);
  17. return mytable;
  18. }
  19. }
  20. }
  21.  
  22. public DataTable GetDataTable()
  23. {
  24. string sql = @"select ID,NAME_SHORT,BELONGTO_ID
  25. from UserInfo
  26. order by BELONGTO_ID";
  27. DataTable dt = getTable(sql);
  28. return dt;
  29. }

3.递归循环生成树

  1. //全局变量用于保存数据
  2. public List<TreeObject> treeNodes = new List<TreeObject>();
  3.  
  4. //建立树的递归方法
  5. /// </summary>
  6. /// <param name="dtSource">数据源</param>
  7. /// <param name="parentNode">父节点</param>
  8. /// <param name="parentID">节点的归属ID</param>
  9. public void BindTree(DataTable dtSource, TreeObject parentNode, string parentID)
  10. {
  11. DataRow[] rows = dtSource.Select(string.Format("BELONGTO_ID={0}", parentID));
  12. foreach (DataRow row in rows)
  13. {
  14. TreeObject tree = new TreeObject();
  15. tree.name = row["NAME_SHORT"].ToString();
  16. tree.value = row["ID"].ToString();
  17. //递归性质,函数内调用自身函数
  18. BindTree(dtSource, tree, row["ID"].ToString());
  19. //递归结束的终点条件
  20. if (parentNode == null)
  21. {
  22. treeNodes.Add(tree);
  23. }
  24. else
  25. {
  26. parentNode.children.Add(tree);
  27. }
  28. }
  29. }

4.调用

  1. //调用SQL,获取数据源
  2. DataTable dt = GetDataTable();
  3. //调用递归函数,传入数据源,根节点
  4. BindTree(dt, null, "");
  5. //反序列化对象,生成json字符串
  6. string jsonData = JsonConvert.SerializeObject(treeNodes);
  7. return jsonData;

5.效果

  1. [{
  2. "name": 'A',
  3. "value": '',
  4. "children": [{
  5. "name": 'B1',
  6. "value": '',
  7. "children": [{
  8. "children": [],
  9. "name": 'C',
  10. "value": ''
  11. },
  12. {
  13. "children": [],
  14. "name": 'D',
  15. "value": ''
  16. },
  17. {
  18. "children": [],
  19. "name": 'E',
  20. "value": ''
  21. }
  22.  
  23. ]
  24. },
  25. {
  26. "name": 'B2',
  27. "value": '',
  28. "children": [{
  29. "children": [],
  30. "name": 'F',
  31. "value": ''
  32. },
  33. {
  34. "children": [],
  35. "name": 'G',
  36. "value": ''
  37. }
  38. ]
  39. },
  40. {
  41. "name": 'B3',
  42. "value": '',
  43. "children": [{
  44. "children": [],
  45. "name": 'H',
  46. "value": ''
  47. },
  48. {
  49. "children": [],
  50. "name": 'I',
  51. "value": ''
  52. },
  53. {
  54. "children": [],
  55. "name": 'J',
  56. "value": ''
  57. }
  58. ]
  59. },
  60. {
  61. "name": 'B4',
  62. "value": '',
  63. "children": [{
  64. "children": [],
  65. "name": 'K',
  66. "value": ''
  67. },
  68.  
  69. {
  70. "name": 'L',
  71. "value": '',
  72. "children": [{
  73. "children": [],
  74. "name": 'L1',
  75. "value": ''
  76. },
  77. {
  78. "children": [],
  79. "name": 'L2',
  80. "value": ''
  81. }
  82. ]
  83. }
  84. ]
  85. }
  86.  
  87. ]
  88. }]

C# ASP.NET递归循环生成嵌套json结构树的更多相关文章

  1. ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...

  2. 详解ASP.NET提取多层嵌套json数据的方法

    本篇文章主要介绍了ASP.NET提取多层嵌套json数据的方法,利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,有兴趣的可以了解一下. 本文实例讲述了ASP.NET利用第三 ...

  3. 【json/regex】将嵌套对象生成的json文进行内部整形排序后再输出

    下载地址:https://files.cnblogs.com/files/xiandedanteng/jsonformat20191126-2.zip 注意:本文仅为draft1版本,还有待完善. 先 ...

  4. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  5. 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

    1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...

  6. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  7. 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 ...

  8. Atitit.json xml 序列化循环引用解决方案json

    Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...

  9. c# 使用递归 循环遍历导航树结构 并解析

    1.数据书库结构 1 家用电器 0 一级菜单 2 手机.数码.京东通信 0 一级菜单 3 电脑.办公 0 一级菜单 4 家具.家居.厨房 0 一级菜单 5 男装.女装.童装.内衣 0 一级菜单 6 个 ...

随机推荐

  1. Java创建线程的方式

    Java中线程的创建有四i种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 3.应用程序 ...

  2. 第一章 Python 基础

    1. 为什么学习 Python? 答题路线:a.python的优点,b.python的应用领域广 具体: 优点 1.python语法非常优雅,简单易学 2.免费开源 3.跨平台,可以自由移植 4.可扩 ...

  3. CF894B Ralph And His Magic Field

    题目链接:http://codeforces.com/contest/894/problem/B 题目大意: 往一个 \(n \times m\) 的网格中填数字 \((1 \le n,m \le 1 ...

  4. 杨辉三角(hdu2032)——有待完善

    思考:杨辉三角形 #include<stdio.h> #include<cstring> int main() { int n; char d; ][] = {}; while ...

  5. #!/usr/bin/python

    它是用来指定用什么解释器运行脚本以及解释器所在的位置. 参考链接:https://www.cnblogs.com/qmfsun/p/6291982.html

  6. Robot Framework(1)- 入门介绍

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html RF 的介绍 R ...

  7. 如何在Teamcenter中使用PMI?

    1 .什么是PMI 在设计制造领域,PMI指的是产品制造信息(Productand Manufacturing Information),其目的在于在三维环境下,将制造信息从设计部门传递到制造部门.其 ...

  8. elementUI中el-input输入数字且保留指定小数位

    <input type="text" placeholder="请输入保留一位小数的数字" class="user-input user-nam ...

  9. JVM调优总结(八)-反思

    垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...

  10. [工具推荐]004.EXE签名工具SignTool使用教程

    数字证书,真是个神奇的东西,可以保证软件不被修改,可以表明文件的发布日期,最重要的,可以很大程度的减少杀毒软件的误报,当然,这就要使用可信任的机构颁发的证书了. 现在要说的不是申请证书,而是如何制作自 ...