关于dataTable 生成JSON 树
背景: POSTGRESL + C# + DHTMLX SUIT
一个表生成一个JSON串,这个不是很麻烦:
1.在数据库(postges)中: json_agg(row_to_json(t))
2.在C#中直接FOR 循环 拼接是没有问题
这都不是我想要的,
我要的更多:一棵树状的JSON串
如上的表生成如下的树:
[
{
"id": "1",
"text": "总工程1",
"items": [
{
"id": "2",
"text": "单位工程1",
"items": [
{
"id": "4",
"text": "分部工程1",
"items": [
{
"id": "6",
"text": "分项工程1",
"items": []
},
{
"id": "8",
"text": "分项工程3",
"items": []
}
]
},
{
"id": "9",
"text": "分部工程3",
"items": []
}
]
},
{
"id": "3",
"text": "单位工程2",
"items": [
{
"id": "5",
"text": "分部工程2",
"items": []
}
]
}
]
},
{
"id": "7",
"text": "总工程2",
"items": []
}
]
说明:表中的数据理论上可能是无限级的
方案1: 在数据库中生成.各种测试,在STACKOVERFLOW 上也找, 但方案都是针对某一个层的,
或是具体某些数据, 花了两到三天,最终放弃!
方案2: 当然就是生成TABLE, 在C# 里拼接, 看起来不是那么的难, 至少比POSTGRES 简单
可是事实上, 并不容易(对我来说)
最终写了一个很烂很烂的类吧, 如下:
public class jsonTree
{
public jsonTree(DataTable dt)
{
//
// TODO: 在此处添加构造函数逻辑
//
this._myDT = dt;
}
private DataTable _myDT = new DataTable();
private string json = string.Empty; public string getJSON()
{
int iRow = _myDT.Rows.Count;
Int32 iLvl = ;
Int32 iMaxLvl = ;
Int32 iTemp = ;
for(int i=;i<iRow;i++)
{
iTemp=Convert.ToInt32(_myDT.Rows[i]["level"].ToString());
if (iTemp > iMaxLvl) iMaxLvl = iTemp;
}
getChild(,iLvl,iMaxLvl);
json = json.Substring(,json.Length-); //删除开头的 items:
return json;
}
private void getChild( Int32 parentID,Int32 iLvl,Int32 iMaxLvl)
{
int iRows = _myDT.Rows.Count;
json += "\"items\":[";
for (int i = ; i < iRows; i++)
{
if (iLvl > iMaxLvl)
{
break;
}
if (Convert.ToInt32(_myDT.Rows[i]["parent_id"].ToString()) == parentID && iLvl == Convert.ToUInt32(_myDT.Rows[i]["level"].ToString()))
{
json += "{\"id\":\"" + Convert.ToInt32(_myDT.Rows[i]["id"].ToString()) + "\",";
json += "\"text\":\""+_myDT.Rows[i]["name"].ToString()+"\",";
getChild(Convert.ToInt32(_myDT.Rows[i]["id"].ToString()),iLvl+,iMaxLvl);
json += "},";
}
if (i == iRows - && iLvl < iMaxLvl)
{
if(json.Substring(json.Length - , ) != "[")
json = json.Substring(, json.Length - );
}
if(iLvl==iMaxLvl && json.Substring(json.Length - , ) == "," && i==iRows-)
json = json.Substring(, json.Length - );
}
json += "]";
}
}
调用时: 1. 直接先生成一个表(select * from Table) myTable
2. jsonTree myTree = new jsonTree(myTable);
string json = myTree.getJSON();
虽然不是很美,不管怎么样, 至少它工作了!
先放在这里, 大家可参考一下, 能有好的意见就更好了!
以后有机会再作修改!
-------------------------------------
这里有个小插曲:生成时 是这样的 items:[]
我返回时,JS怎么也不认!!!!
原因: 标准的JSON 是以 {}或[]开头的
另: JSON的KEY-VALUE都需要双引号
关于dataTable 生成JSON 树的更多相关文章
- JavaScript通过父节点ID递归生成JSON树
JavaScript通过父节点ID递归生成JSON树: · 实现思路:通过递归实现(第一次递归的时候查询出所有的父节点,然后通过当前父节点id不断地去查询所有子节点,直到递归完毕返回) · 代码示 ...
- Datatable 生成json格式
public string GetJsonFromDataTable(DataTable dt, int total, bool ShowFooter, string fields, string i ...
- js动态生成JSON树
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- datatable生成easyui的json格式汇总( 转)
转自 http://www.cnblogs.com/WikStone/archive/2012/07/02/2573137.html 目前项目没有使用第三方的json转换库,都是根据json格式进行字 ...
- 用友U8存货分类通过DataTable生成EasyUI Tree JSON
<%@ WebHandler Language="C#" Class="InventoryClass" %> using System; using ...
- DataSet、DataTable、Json、List 等各种数据的相互转化
1.根据Dataset生成json格式的字符串,不管Dataset里面有多少个表都可以一一生成对应的json字符串,并一次性返回 private string dsToJson(DataSet d ...
- jquery: json树组数据输出到表格Dom树的处理方法
项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...
- JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List转JSON,JSON转List,JSON转C#对象
一.JSON解析与字符串化 JSON.stringify() 序列化对象.数组或原始值 语法:JSON.stringify(o,filter,indent) o,要转换成JSON的对象.数组或原始值 ...
- C#递归生成HTML树,C#递归生成xml树
C#递归生成HTML树 public StringBuilder str = new StringBuilder(); //定义一个字符串 private void get_navigation_ ...
随机推荐
- Algorithms & Data structures in C++& GO ( Lock Free Queue)
https://github.com/xtaci/algorithms //已实现 ( Implemented ): Array shuffle https://github.com/xtaci/al ...
- GBK点阵显示字库的制作和使用
转自:http://blog.csdn.net/exbob/article/details/6539643 GBK编码共收录汉字21003个.符号883个,并提供1894个造字码位,简.繁体字融于一库 ...
- 《精通Spring4.X企业应用开发实战》读后感第五章(注入参数详解)
- 【机器学习】决策树C4.5、ID3
一.算法流程 step1:计算信息熵 step2: 划分数据集 step3: 创建决策树 step4: 利用决策树分类 二.信息熵Entropy.信息增益Gain 重点:选择一个属性进行分支.注意信息 ...
- “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)
一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增删改查的地步.测试好之后再来看这篇文章,我的主框架相对来说简答一点,重点还是实现系统的功能,以及对Jquery-Eas ...
- 查看 打包秘钥的 SHA1
keytool -v -list -keystore C:\Users\XXX\.android\debug.keystore 输入密钥库口令: android android
- asp.net清空页面上的所有TextBox
Asp.net中一次性清空页面上的所有TextBox中的内容,由于TextBox在客户端以<input type=”text”>形式来呈现的,因此解决方案有客户端和服务器端两种方式,服务器 ...
- .net 扩展方法,lamada表达式 委托
扩展方法 (1)扩展方法是一种特殊的静态方法,它定义在一个静态类中,但可以在其他类的对象上向调用实例方法那样进行调用.因此,通过扩展方法,我们就可以在不修改一个类型的前提下对一个类型进行功能上的扩充, ...
- redis win系统安装并设置开机自启
安装包下载网址 :https://github.com/MSOpenTech/redis/releases 找到最新发布的安装包进行下载 下载完后解压到c盘 打开cmd,并进到redis里面 cd C ...
- ue4 打个log难如狗
注意: 把log相关两个宏写到类中,并编译后,在输出日志的位置的Categories关键字过滤的位置看不到自己的标签是因为需要先运行一次,输出一些这个标签的log后,这个自定义的标签才会显示在这 原文 ...