关于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都需要双引号 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用开源的图表库,比如 Google Charts、Chart.js 或 Highcharts 等。这些库都提供了 .NET 和 ASP.NET 的支持,可以通过后台代码生成图表数据,并在前端页面渲染出来。下面是一个使用 Google Charts 的示例: 1. 在 HTML 页面中引入 Google Charts 的 JavaScript 库: ``` <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> ``` 2. 在后台代码中生成图表数据: ``` protected void Page_Load(object sender, EventArgs e) { // 创建一个 DataTable 对象 DataTable dt = new DataTable(); dt.Columns.Add("Year"); dt.Columns.Add("Sales"); // 添加数据行 dt.Rows.Add(new object[] { "2016", 100 }); dt.Rows.Add(new object[] { "2017", 150 }); dt.Rows.Add(new object[] { "2018", 200 }); // 将 DataTable 转换为 JSON 字符串 string json = DataTableToJson(dt); // 在页面上注册一个 JavaScript 函数,用于绘制图表 ClientScript.RegisterStartupScript(this.GetType(), "DrawChart", "drawChart('" + json + "');", true); } // 将 DataTable 转换为 JSON 字符串的方法 public static string DataTableToJson(DataTable dt) { StringBuilder sb = new StringBuilder(); sb.Append("["); for (int i = 0; i < dt.Rows.Count; i++) { sb.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { sb.Append("\"" + dt.Columns[j].ColumnName + "\":\"" + dt.Rows[i][j].ToString() + "\""); if (j < dt.Columns.Count - 1) { sb.Append(","); } } sb.Append("}"); if (i < dt.Rows.Count - 1) { sb.Append(","); } } sb.Append("]"); return sb.ToString(); } ``` 3. 在 JavaScript 中绘制图表: ``` function drawChart(json) { var data = new google.visualization.DataTable(); data.addColumn('string', 'Year'); data.addColumn('number', 'Sales'); data.addRows(JSON.parse(json)); var options = { title: 'Sales by Year', width: 500, height: 300 }; var chart = new google.visualization.LineChart(document.getElementById('chart_div')); chart.draw(data, options); } ``` 这个示例中,我们使用了 Google Charts 库,生成了一个简单的折线图。在后台代码中,我们创建了一个 DataTable 对象,并添加了一些数据行。然后将 DataTable 转换为 JSON 字符串,并将其作为参数传递给 JavaScript 函数。在 JavaScript 函数中,我们使用 Google Charts 提供的 API,将数据绘制成图表,并将其显示在页面上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值