声明本文摘自:http://www.cnblogs.com/yangrixing/archive/2012/08/23/2651900.html
今天在群里有群友求助,吾正好有空,顺便解答一下。
废话少说中,直切主题。
主要解决内容:将一个数据表生成一个JSON格式的,有层次结构的“目录”树。
生成的JSON字符串经过格式化后,如下图所示:
图1 效果图
如何实现呢?
一、给出数据库的结构,让大家思考一下。
数据库的结构和数据截图分别如下:
图2 数据库结构 图3 数据库中的数据
好了,数据库的结构已经给出了,那,应该如何生成像图1所示的JSON数据格式呢?
毫无疑问,必须用到“序列化”吧?
毫无疑问,必须用到“递归算法”吧?如果您不知道的除外~我的博客里有收集了一些“递归算法”的经典应用,欢迎移步。
嗯,没错。那就让我们来看看如何设计这个递归算法了。
第一步:根所JSON格式,先写相应的实体类,为读取数据后封装提供支持。
先来分析一下JSON数据的结构,终合而言,是由一个text字段,children[]数据组成的对象(我们且称之为item对象吧),而children[]数组中,又包含了该对象。因为,可以利用此特性,设计一个类以支持递归算法的实现。
废话少说了,直接贴码了:
代码1 封装好的类,如下图所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
///
<summary>
///
节点的实体类,记录了数据库中的3个字段
///
为的是方便操作
///
</summary>
[Serializable]
public class Items
{
public int bh;
public string text;
public int parentBh;
}
///
<summary>
///
节点类,基础类
///
</summary>
[Serializable]
public class JieDian
{
public string text= "" ;
public jieDian[]
children = null ;
}
[Serializable]
public class Cliet
{
public Items[]
GetTheItems ( string parentBh)
{
string sql
= "select
* from Table_3 where parentBh=" +parentBh;
SqlDataReader
dr = SQLHelp.ExecuteReader(sql);
List<Items>
items = new System.Collections.Generic.List<Items>();
while (dr.Read())
{
Items
i = new items();
i.bh
= dr.GetInt32(0);
i.text
= dr.GetString(1);
i.parentBh
= dr.GetInt32(2);
items.Add(i);
}
dr.Close();
return items.ToArray();
}
public void creatTheTree
( string parentBh
,jieDian jd)
{
Items[]
items = GetTheItems(parentBh);
if (items.Length
== 0)
return ;
List<JieDian>
jdList = new System.Collections.Generic.List<JieDian>();
for ( int i
= 0; i < items.Length; i++)
{
JieDian
jiedian = new JieDian();
jiedian.text
= items[i].text;
creatTheTree(items[i].bh.ToString(),
jiedian);
jdList.Add(jiedian);
}
jd.children
= jdList.ToArray();
}
}
|
第二步:调用写好的类,序列化成JSON格式
新建一个“一般处理程序(.ashx),直接用C#的一般处理程序生成,以便前台通过异步接收到生成的字符串。
代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<%@
WebHandler Language= "C#" Class= "Handler" %>
using System;
using System.Web;
using System.Web.SessionState;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Json;
using Dkl.New3.Chart;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
public class Handler
: IHttpHandler {
public void ProcessRequest
(HttpContext context) {
context.Response.ContentType
= "text/plain" ;
Cliet
clite = new Cliet();
JieDian
root = new JieDian();
root.text
= "根节点" ;
clite.creatTheTree( "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, 0, aryByte.Length);
ms.Close();
context.Response.Write(json.ToString());
}
public bool IsReusable
{
get {
return false ;
}
}
}
|
第三步:运行
运行结果如下:
图4 运行结果
经
经JSON数据格式化后,工具地址(http://www.bejson.com/go.html?u=http://www.bejson.com/jsonview2/)
得到以下视图:
图5 格式化
第四步:反思。
主要有以下几点反思
1、程序还有诸多一足,只能是一个Deom,还有很多安全方面、序列化顺序、序列化速度、序列化的名称等可以继续完善。
2、加深了对递归算法的理解。
3、这样的设计是否得当?是不是还有更好的办法?
4、这样的设计,容易扩展吗?
嗯,相信日后会继续慢慢完善的。
亲爱的,今天是七夕喔,如果觉得本文对你有用,欢迎点击右下方的“收藏”喔~也可以关注我呢!
欢迎各位博园给我提意见!
分享到:
相关推荐
.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法.net 递归算法
Java递归算法构造JSON树形结构,Java递归算法构造JSON树形结构Java递归算法构造JSON树形结构
在JSP中使用递归算法生成目录树 计算机工程与设计2005年第1期
asp.net 对文件进行操作if (Directory.Exists(dir)) //如果存在这个文件夹删除之 { foreach (string d in Directory.GetFileSystemEntries(dir)) { if (File.Exists(d)) File.Delete(d); //直接删除其中的文件...
DEMO采用数据库和ASP.NET网页开发。 具体示例请下载后继续了解。谢谢。
这是一个学习ASP.NET treeview控件的demo,通过递归生成一棵部门树。部门表结构在解决方案中。解压密码: 1435279215
.net 递归 树 可以看下,能看到东西的
EmployeeSystem 基于.net平台递归树
.Net 初学者的树控件和递归算法求阶乘 .Net 初学者的树控件和递归算法求阶乘
使用递归生成文件目录树 .txt 使用递归生成文件目录树 .txt
.net的算法 递归算法 可以好好理解
.net递归算法优化源码案例
ASP.NET 实现动态生成树结构 附源码 使用的是递归算法
利用xml字符串和io类写的! 如果有什么疑问,请联系我QQ:165150345!
不重复顺序递归不重复顺序递归,递归,排序,WEB,.NET,PHP,ASP.NET
递归运算示例,这是个简单案例,基于此可以设计出多定义域函数求值程序。
主要介绍了asp.net TreeView递归循环子节点生成树形菜单的方法,涉及asp.net递归算法及节点操作相关技巧,需要的朋友可以参考下
C#使用递归算法,生成并画树形状的图形。详细介绍请到博客中看看
借用jquery控件实现对树的展示,后台使用递归对树的组建。。
使用递归算法打印目录下所有的文件,递归也是帮助我们在编程时解决一些数学上的问题,一般经常解决的就是阶乘问题!