c# 使用递归 循环遍历导航树结构 并解析
1、数据书库结构

| 1 | 家用电器 | 0 | 一级菜单 |
| 2 | 手机、数码、京东通信 | 0 | 一级菜单 |
| 3 | 电脑、办公 | 0 | 一级菜单 |
| 4 | 家具、家居、厨房 | 0 | 一级菜单 |
| 5 | 男装、女装、童装、内衣 | 0 | 一级菜单 |
| 6 | 个人护装、清洁用品 | 0 | 一级菜单 |
| 7 | 大家电 | 1 | 二级菜单 |
| 8 | 厨卫大电 | 1 | 二级菜单 |
| 9 | 厨卫小电 | 1 | 二级菜单 |
| 10 | 生活用品 | 1 | 二级菜单 |
| 11 | 平板电视 | 7 | 三级菜单 |
| 12 | 家用空调 | 7 | 三级菜单 |
| 13 | 油烟机 | 8 | 三级菜单 |
| 14 | 燃气灶 | 8 | 三级菜单 |
| 16 | 电饭煲 | 9 | 三级菜单 |
| 17 | 微波炉 | 9 | 三级菜单 |
| 18 | 手机通讯 | 2 | 二级菜单 |
| 19 | 运营商 | 2 | 二级菜单 |
| 20 | 京东通信 | 2 | 二级菜单 |
| 21 | 手机 | 18 | 三级菜单 |
| 22 | 对讲机 | 18 | 三级菜单 |
| 23 | 手机维修 | 18 | 三级菜单 |
| 24 | 选号中心 | 20 | 三级菜单 |
| 25 | 自助服务 | 20 | 三级菜单 |
| 26 | 电脑整机 | 3 | 二级菜单 |
| 27 | 电脑配件 | 3 | 二级菜单 |
| 28 | 外设产品 | 3 | 二级菜单 |
| 29 | 笔记本 | 26 | 三级菜单 |
| 30 | 游戏本 | 26 | 三级菜单 |
| 31 | 平板电脑 | 26 | 三级菜单 |
| 32 | CPU | 27 | 三级菜单 |
| 33 | 主板 | 27 | 三级菜单 |
| 34 | 显卡 | 27 | 三级菜单 |
| 36 | 鼠标 | 28 | 三级菜单 |
| 37 | 键盘 | 28 | 三级菜单 |
2、c#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using SanxingjinxiaocunDAL;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Text; namespace Sanxingjinxiaocun.qinghua
{
/// <summary>
/// Method 的摘要说明
/// </summary>
public class Method : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
#region 调用写好的类,序列化成JSON格式
Cliet clite = new Cliet();
JieDian root = new JieDian();
root.Name = "根节点";
root.Id = ;
clite.creatTheTree("", root); //根节点的parentBh值为"0" //对root对象进行序列化
DataContractJsonSerializer dc = new DataContractJsonSerializer(root.GetType());
MemoryStream ms = new MemoryStream();
dc.WriteObject(ms, root);
byte[] aryByte = ms.ToArray();
string json = Encoding.UTF8.GetString(aryByte, , aryByte.Length);
ms.Close();
context.Response.Write(json.ToString());
#endregion
} public bool IsReusable
{
get
{
return false;
}
}
} #region 根所JSON格式,先写相应的实体类,为读取数据后封装提供支持。
///<summary>
///节点的实体类,记录了数据库中的3个字段
///为的是方便操作
/// </summary>
[Serializable]
public class Item
{
public int Id;
public string Name;
public int ParentId;
public string ContentText;
}
/// <summary>
/// 节点类,基础类
/// </summary>
[Serializable]
public class JieDian
{
public string Name = "";
public int Id = ;
public int ParentId = ;
public string ContentText = "";
public JieDian[] children = null;
}
/// <summary>
/// ss
/// </summary>
[Serializable]
public class Cliet
{
//根据parentBh获取相应的子目录集合
public Item[] GetTheItems(string parentId)
{
//根据父节点获取选项集合
string sql = "select * from t_Menu where parentId=" + parentId;
//这里改成你的数据库表
SqlDataReader dr = DbHelperSQL.ExecuteReader(sql); //这里我直接调用了我库中的类
List<Item> items = new System.Collections.Generic.List<Item>();
while (dr.Read())
{
Item i = new Item();
i.Id = dr.GetInt32();
i.Name = dr.GetString();
i.ParentId = dr.GetInt32();
i.ContentText = dr.GetString();
items.Add(i);
}
dr.Close();
//一定要对这进行关闭
return items.ToArray();
//返回
} //生成树的方法
public void creatTheTree(string parentId, JieDian jd)
{
//获取
Item[] items = GetTheItems(parentId);
//如果没有字节点了,那就返回空
if (items.Length == )
return;
List<JieDian> jdList = new List<JieDian>();
for (int i = ; i < items.Length; i++)
{
JieDian jiedian = new JieDian();
jiedian.Id = items[i].Id;
jiedian.Name = items[i].Name;
jiedian.ParentId = items[i].ParentId;
jiedian.ContentText = items[i].ContentText;
//递归循环
creatTheTree(items[i].Id.ToString(), jiedian);
jdList.Add(jiedian);
}
jd.children = jdList.ToArray(); //由于对象是引用类型,因为可以改变参数的值
}
}
#endregion
}
3、返回Json:
var data ={
"ContentText": "",
"Id": 0,
"Name": "根节点",
"ParentId": 0,
"children": [
{
"ContentText": "一级",
"Id": 1,
"Name": "家电电器",
"ParentId": 0,
"children": [
{
"ContentText": "二级",
"Id": 4,
"Name": "小米电视",
"ParentId": 1,
"children": [
{
"ContentText": "三级",
"Id": 7,
"Name": "小米1S",
"ParentId": 4,
"children": null
},
{
"ContentText": "三级",
"Id": 8,
"Name": "小米2S",
"ParentId": 4,
"children": null
},
{
"ContentText": "三级",
"Id": 9,
"Name": "小米3S",
"ParentId": 4,
"children": null
}
]
},
{
"ContentText": "二级",
"Id": 6,
"Name": "乐视电视",
"ParentId": 1,
"children": [
{
"ContentText": "三级",
"Id": 10,
"Name": "超级电视1",
"ParentId": 6,
"children": null
},
{
"ContentText": "三级",
"Id": 11,
"Name": "超级电视2",
"ParentId": 6,
"children": null
}
]
}
]
},
{
"ContentText": "一级",
"Id": 3,
"Name": "孕妇婴儿",
"ParentId": 0,
"children": [
{
"ContentText": "二级",
"Id": 13,
"Name": "孕妇装",
"ParentId": 3,
"children": null
},
{
"ContentText": "二级",
"Id": 14,
"Name": "孕妇枕",
"ParentId": 3,
"children": null
},
{
"ContentText": "二级",
"Id": 15,
"Name": "孕妇钙片",
"ParentId": 3,
"children": null
},
{
"ContentText": "二级",
"Id": 16,
"Name": "婴儿车",
"ParentId": 3,
"children": [
{
"ContentText": "三级",
"Id": 19,
"Name": "摇摇车",
"ParentId": 16,
"children": null
},
{
"ContentText": "三级",
"Id": 20,
"Name": "木马车",
"ParentId": 16,
"children": null
}
]
},
{
"ContentText": "二级",
"Id": 18,
"Name": "婴儿奶粉",
"ParentId": 3,
"children": null
}
]
}
]
}
递归循环解析:
$.each(data.children,function(index,item1){
console.log(item1)
if(item1.children){
$.each(item1.children,function(index,item2){
console.log(item2)
if(item2.children){
$.each(item2.children,function(index,item3){
console.log(item3)
})
}
})
}
c# 使用递归 循环遍历导航树结构 并解析的更多相关文章
- Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 1.1. 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. ...
- 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...
- 003_循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...
- DOM 元素的循环遍历
博客地址:https://ainyi.com/89 获取 DOM 元素的几种方式 get 方式: getElementById getElementsByTagName getElementsBy ...
- Visual Studio 2010下ASPX页面的TreeView控件循环遍历
如果维护一个老系统就总会遇到各种问题,而这次是TreeView的循环遍历.对于Visual Studio2010上aspx页面的TreeView控件,我感受到了什么叫集微软之大智慧.与二叉树型不一样. ...
- php用压栈的方式,循环遍历无限级别的数组(非递归方法)
php用压栈的方式,循环遍历无限级别的数组(非递归方法) 好久不写非递归遍历无限级分类...瞎猫碰到死老鼠,发刚才写的1段代码,压栈的方式遍历php无限分类的数组... php压栈的方式遍历无限级别数 ...
- json原理和jquey循环遍历获取所有页面元素
1.json原理: javascript object notation (javascript 对象表示法) 是一种轻量级的数据交换语言,由javascript衍生而出,适用于.NET java c ...
- C# ASP.NET递归循环生成嵌套json结构树
1. 建立用来保存树结构数据的目标对象 public class TreeObject { public string name { get; set; } public string value { ...
- To Java程序员:切勿用普通for循环遍历LinkedList
ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...
随机推荐
- BZOJ 1014 火星人prefix
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- iOS之H5和Native混合开发
今天需要用到一个H5和Native 混合开发的项目,简单的写一点入门的东西,很简答: 先介绍一下简单的配置步骤: 1.新建项目:SB拖一个UIWebView 按住Ctrl 拖线delegate 设置为 ...
- 辉哥用的这种方法实现ZABBIX的MYSQL批量监控
不错的.集中和分布式,总是一对要解决的问题.应该可以再想更好的策略~~ 一.方案需求及思路 因跑MySQL服务的服务器比较多,并且每台服务器可能会运行多个不同端口的数据库,如果单独手动一台一台去修改a ...
- STL容器介绍(转)
STL的容器可以分为以下几个大类: 一:序列容器, 有vector, list, deque, string. 二 : 关联容器, 有set, multiset, map, mulmap, h ...
- 【单调队列】Vijos P1771 瑞士轮 (NOIP2011普及组第三题)
题目链接: https://vijos.org/p/1771 题目大意: 给定2N个人(N<=100 000)和其初始分数.能力值(能力两两不同),比赛M次(M<=50),每次PK都是按分 ...
- Pet
Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He ...
- freemarker使用map
freemaker强大的地方是还可以使用map. 一个场景就是对应后端的type类型, type=01,02,03,04, 我们可以在controller定义一个map typeMap,好处就 ...
- Mac下Intellij IDea发布Web项目详解一
Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...
- linux 下安装配置jboss as7以及部署应用
linux 下安装配置jboss as7以及部署应用 1.测试平台及软件 centos 5.4 jdk-7u5-linux-i586.rpm jboss-as-7.1.1.Final.zip jbos ...
- H - Cow Contest
有N头牛,编号从1到N,参与一个变成比赛(大牛编程比赛,一般水水平敢参加???),一些牛的代码比较出色,每头牛都有一个独一无二的技能等级在这些竞争者中. 比赛循环进行在任意两头牛之间(姑且这么翻译吧) ...