背景: 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 树的更多相关文章

  1. JavaScript通过父节点ID递归生成JSON树

    JavaScript通过父节点ID递归生成JSON树: · 实现思路:通过递归实现(第一次递归的时候查询出所有的父节点,然后通过当前父节点id不断地去查询所有子节点,直到递归完毕返回)   · 代码示 ...

  2. Datatable 生成json格式

    public string GetJsonFromDataTable(DataTable dt, int total, bool ShowFooter, string fields, string i ...

  3. js动态生成JSON树

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. datatable生成easyui的json格式汇总( 转)

    转自 http://www.cnblogs.com/WikStone/archive/2012/07/02/2573137.html 目前项目没有使用第三方的json转换库,都是根据json格式进行字 ...

  5. 用友U8存货分类通过DataTable生成EasyUI Tree JSON

    <%@ WebHandler Language="C#" Class="InventoryClass" %> using System; using ...

  6. DataSet、DataTable、Json、List 等各种数据的相互转化

      1.根据Dataset生成json格式的字符串,不管Dataset里面有多少个表都可以一一生成对应的json字符串,并一次性返回 private string dsToJson(DataSet d ...

  7. jquery: json树组数据输出到表格Dom树的处理方法

    项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...

  8. JSON之Asp.net MVC C#对象转JSON,DataTable转JSON,List转JSON,JSON转List,JSON转C#对象

    一.JSON解析与字符串化 JSON.stringify() 序列化对象.数组或原始值 语法:JSON.stringify(o,filter,indent) o,要转换成JSON的对象.数组或原始值 ...

  9. C#递归生成HTML树,C#递归生成xml树

    C#递归生成HTML树 public StringBuilder str = new StringBuilder();   //定义一个字符串 private void get_navigation_ ...

随机推荐

  1. [转]BX9054: 各浏览器对 document.execCommand 方法的首参数可选值范围存在差异

    作者:钱宝坤 标准参考 无. 问题描述 execCommand 方法通常用于控制可编辑的 IFRAME 内容,制作富文本编辑器. 但他现在为止还是非标准的,方法的首参数 Commmands 的可选值由 ...

  2. Oracle获取日期的特定部分

    (1)oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 ,语法:extract ({ year | month | day ...

  3. android TextView selector点击样式改变

    1.selector 从单词的意思来说:选择器,就是对你的目标的控制.selector主要是用在ListView的item单击样式和TextView和Button的点击样式. 2.主要属性介绍: an ...

  4. Excel解析easyexcel工具类

    Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...

  5. Stored Procedures CASE 用法错误

    )) )     select @type=[type] from sys.objects with(nolock) where name=@ObjectName          case @typ ...

  6. SetROP2

    一个Windows API SetROP2(int nDrawMode)的使用 该函数的主要的作用是根据nDrawMode设置的方式重新设定绘图的方式,下面就不同的nDrawMode值具体解释绘图模式 ...

  7. 深度解析VC中的消息传递机制

    摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面 ...

  8. python 2 与python 3 区别

    print def print(self, *args, sep=' ', end='\n', file=None): # known special case of print "&quo ...

  9. include跟include_once 以及跟require的区别

    include如果引入两个文件,都有一个相同的函数名,那么就会发生重定义的错误.使用include_once可以避免此错误,一般都_once用的比较多.应该根据实际情况需求include和_once的 ...

  10. 机器学习中的L1、L2正则化

    目录 1. 什么是正则化?正则化有什么作用? 1.1 什么是正则化? 1.2 正则化有什么作用? 2. L1,L2正则化? 2.1 L1.L2范数 2.2 监督学习中的L1.L2正则化 3. L1.L ...