zoukankan      html  css  js  c++  java
  • 关于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 = 1;
            Int32 iMaxLvl = 0;
            Int32 iTemp = 0;
            for(int i=0;i<iRow;i++)
            {
                iTemp=Convert.ToInt32(_myDT.Rows[i]["level"].ToString());
                if (iTemp > iMaxLvl) iMaxLvl = iTemp;
            }
            getChild(0,iLvl,iMaxLvl);
            json = json.Substring(8,json.Length-8); //删除开头的 items:
            return json;
        }
        private void getChild( Int32 parentID,Int32 iLvl,Int32 iMaxLvl)
        {
            int iRows = _myDT.Rows.Count;
            json += ""items":[";
            for (int i = 0; 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+1,iMaxLvl);
                    json += "},";
                }
                if (i == iRows - 1 && iLvl < iMaxLvl)
                {
                        if(json.Substring(json.Length - 1, 1) != "[") 
                            json = json.Substring(0, json.Length - 1);
                } 
                if(iLvl==iMaxLvl  && json.Substring(json.Length - 1, 1) == "," && i==iRows-1)
                    json = json.Substring(0, json.Length - 1);
            }
            json += "]";
        }
    }

    调用时:   1.    直接先生成一个表(select * from Table) myTable

         2.    jsonTree myTree = new jsonTree(myTable);

          string json = myTree.getJSON();

    虽然不是很美,不管怎么样, 至少它工作了!

    先放在这里, 大家可参考一下, 能有好的意见就更好了!

    以后有机会再作修改!

    -------------------------------------

    这里有个小插曲:生成时  是这样的     items:[]

    我返回时,JS怎么也不认!!!!

    原因:          标准的JSON 是以 {}或[]开头的

       另:       JSON的KEY-VALUE都需要双引号 

  • 相关阅读:
    myEclipse Debug
    C# DataTable的詳細使用方法
    算法 《秦九韶算法java实践》
    【闲聊产品】之五:谁来背黑锅?
    ubuntu install mysql server method
    H264解码的一个測试程序
    Struts2自己定义拦截器实例—登陆权限验证
    【剑指offer】二叉树的镜像
    ubuntu12.04下搭建ftpserver
    C++Vector使用方法
  • 原文地址:https://www.cnblogs.com/ssqhan/p/7462585.html
Copyright © 2011-2022 走看看