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# 使用递归 循环遍历导航树结构 并解析的更多相关文章

  1. Atitit  循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).

    Atitit  循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 1.1. 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. ...

  2. 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别

    表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...

  3. 003_循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别

    表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...

  4. DOM 元素的循环遍历

    ​博客地址:https://ainyi.com/89​ 获取 DOM 元素的几种方式 get 方式: getElementById getElementsByTagName getElementsBy ...

  5. Visual Studio 2010下ASPX页面的TreeView控件循环遍历

    如果维护一个老系统就总会遇到各种问题,而这次是TreeView的循环遍历.对于Visual Studio2010上aspx页面的TreeView控件,我感受到了什么叫集微软之大智慧.与二叉树型不一样. ...

  6. php用压栈的方式,循环遍历无限级别的数组(非递归方法)

    php用压栈的方式,循环遍历无限级别的数组(非递归方法) 好久不写非递归遍历无限级分类...瞎猫碰到死老鼠,发刚才写的1段代码,压栈的方式遍历php无限分类的数组... php压栈的方式遍历无限级别数 ...

  7. json原理和jquey循环遍历获取所有页面元素

    1.json原理: javascript object notation (javascript 对象表示法) 是一种轻量级的数据交换语言,由javascript衍生而出,适用于.NET java c ...

  8. C# ASP.NET递归循环生成嵌套json结构树

    1. 建立用来保存树结构数据的目标对象 public class TreeObject { public string name { get; set; } public string value { ...

  9. To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...

随机推荐

  1. fread遇到1A则读取停止,发现是1A是文件截止符

    fread遇到1A则读取停止,发现是1A是文件截止符 按二进制来读来则可以完全读取

  2. 利用多线程资源竞争技术上传shell

    通过多线程资源竞争的手段同时上传两个头像,就可以在Apache+Rails环境下实现远程代码执行.这并不是天方夜谭,同时我相信许多文件上传系统都会有这个漏洞……这是一个非常有趣的安全实验,一起来看看吧 ...

  3. C# IOCP服务器

    C# IOCP服务器 @by  群63438968 这是我写的unity 网络斗地主的服务器源码,本来我想只公开部份服务端代码的,但是为了回报大家的热情,以及曾经和现在的好兄弟,我计划慢慢开源! 告诉 ...

  4. Struts2拦截器总结<转>

    由于项目中在登录跳转到其他应用程序模块的时候有用到拦截器,因此查看了一下相关资料. 原文地址:http://blog.csdn.net/sendfeng/article/details/4248120 ...

  5. 汉字转拼音的Java类库:JPinyin

    JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进. [JPinyin主要特性]1.准确.完善的字库:Unicode编码从4E00-9FA5范围及3007(〇 ...

  6. Android中attr自定义属性详解

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wen=http ...

  7. java实战之数组工具集

    java是一门面向对象的语言,我们也提到过,面向对象的一个优点就在于能够提高代码的复用性,前面我们详细讲过数组的查找,排序,等等,为了提高代码的复用性,我们何不自己写一个数组的工具集,来综合下前面所学 ...

  8. Curling 2.0(dfs)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8795   Accepted: 3692 Description On Pl ...

  9. C++排序

    浅谈C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析(好戏在后面,有图有真相) 最近一段时间去武汉参加了N多笔试,在几次试题中都出现了排序.偏偏出现了我没怎么看的插入排序, ...

  10. 外星人的供给站 (区间覆盖 t贪心)

    /** 区间覆盖问题 分析: 每个点可以确定两个圆心 圆心的范围形成 一个区间 在这个区间上以任意一点画圆便可将此点 包含在内 如果有两个点所确定的区间相交了 说明这两个点可以用一个圆包含在内 即用一 ...