EasyUI tree读取sql server的表结构得到json格式

  本来项目需要一个tree的树结构,后来随便选择了一个easyUI tree开源框架,后来碰到一个问题,我是要从数据库递归出结构的,转成json的,怎么做?难道是递归了拼接StringBuilder?要是这样做就太傻了,当时也打算这么做。然后各种百度,博客园,QQ群去问,回答的也是五花八门,没人给我指点详细的,我只好自己琢磨了。

第一:递归数据库的表。

第二:序列化最后的递归结果。

这里是我的数据库的表:

                    技术分享

然后下面是代码:

这里需要建立一个实体类,类的属性跟数据库表的一样,只是多了一个泛型属性,是为了保存子对象,你想看,要是这个类的属性有:ID,Name,ParentID(数据库的字段一样)你怎么递归得到父子的关系的tree?所以就多一个字段,这个字段就是泛型,例如我下面声明的类叫:Tree,所以我的类里有4个属性:ID,Name,ParentID,item,因为在easyUI tree里面,它的json结构是这样的:

  [{ "id":"1" , "text":"文件夹" , "status":"open" , "children":

      [{ "id":"1" , "text":"文件夹" , "status":"open" , "children":null }]

  }]

所以多这个List<Tree>就是保存一个一模一样的子对象,这里我声明item为保存子对象。

1     public class Tree
2     {
3         public int ID;
4         public string Name;
5         public int ParentID;
6         public List<Tree> item;
7     }

 

这里就是我写的递归方法:

 1      /// <summary>
 2         ///  用于遍历数据库表中保存上下级关系的tree结构
 3         /// </summary>
 4         /// <param name="ParentID">父级ID</param>
 5         /// <param name="li">list对象</param>
 6         /// <returns></returns>
 7         protected List<Tree> Recursive(int ParentID,List<Tree> li)
 8         {
 9             DataSet ds_content = Sql.GetDaTa("SELECT * FROM tb_cm WHERE parentID=" + ParentID);
10             if (ds_content.Tables[0].Rows.Count > 0)//判断如果查询到的结果不为空,才去递归
11             {           
12                 //DataSet ds_content = Sql.GetDaTa("SELECT * FROM tb_cm WHERE parentID=" + ParentID);//根据父id查询有没有子id
13                 for (int i = 0; i < ds_content.Tables[0].Rows.Count; i++)
14                 {
15                     List<Tree> lis = new List<Tree>();//声明一个泛型用于保存子对象,Tree是我自己建立的一个类,
16                     Tree t = new Tree();
17                     t.ID = int.Parse(ds_content.Tables[0].Rows[i][0].ToString());               
18                     t.Name = ds_content.Tables[0].Rows[i][1].ToString();                        
19                     t.ParentID=int.Parse(ds_content.Tables[0].Rows[i][2].ToString());         
20                     DataSet ds_HaveItem = Sql.GetDaTa("SELECT id FROM tb_cm WHERE parentID="+t.ID);//查询用于判断是否有子对象
21                     //三元运算符判断大于0代表有子对象,有就返回遍历,否则返回null
22                     t.item = ds_HaveItem.Tables[0].Rows.Count > 0 ? Recursive(t.ID, lis) : null;
23 
24                     li.Add(t);                        
25                 }
26             }
27             return li;
28         }    

 

这里就是序列化,序列化就变成json格式,所以不需要sb.append("[{")这样的去拼接字符串:

1  protected void Page_Load(object sender, EventArgs e)
2         {
3             GridView1.DataSource = Sql.GetDaTa("select * from tb_cm");
4             GridView1.DataBind();
5 
6             List<Tree> li = new List<Tree>();
7             Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(Recursive(0, li)));
8         }

 

这个Newtonsoft.Json.JsonConvert.SerializeObject()序列化是我去csdn看别人回答的时候提到这个,这个是别人封装了的东西,从github下载来的,下载好了放到项目里,在项目里的引用那里点击【添加引用】,然后选择【浏览】找到你的项目里的这个dll,然后就成这样了:

技术分享

 

下面这个Sql是我自己建立的类,里面返回查询结果,你可以自己写吧,记得在这个类的最上面引用的地方输入:using System.Configuration;

 1     public class Sql
 2     {
 3         static string connstr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
 4 
 5         static SqlConnection conn = new SqlConnection(connstr);
 6 
 7         public static DataSet GetDaTa(string sql)
 8         {
 9             DataSet ds = new DataSet();
10             SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
11             sda.Fill(ds);
12             
13             return ds;
14         }
15 
16     }

 

配置文件:

技术分享

 

然后就运行吧:

技术分享

已经输出json格式的内容了,把它赋值到json在线编辑器看看如何?

技术分享

 

嗯,一切正常,我就不做前台的了,你用的话自己在前台ajax请求到后台返回这个结果就行了。睡觉了,一下还要上班。。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。