C#DataTable到Json(具有自定义格式)

时间:2018-09-17 12:01:04

标签: c# asp.net json serialization

我想序列化具有自定义格式(小得多)的DataTable-每行都没有字段名。

例如,我的数据表只有2列-ID和Name。 结果Json应该是:

{
  "Columns": 
    [
    {"ID": "Int"},
    {"Name": "String"},
    ],
  "Rows": 
    [
    ["1","John Smith"],
    ["2","Mary Williams"]    
    ]
}

以下格式甚至可以序列化空的数据表,并且不会在每一行上产生字段名复制。

任何建议怎么做?

1 个答案:

答案 0 :(得分:2)

这是如何做的基础。该实现将所有内容都存储在内存中,这对于大量数据而言并不理想,但是仍然可以为您指明正确的方向。这样会打印出您希望我相信的JSON。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

using Newtonsoft.Json;

namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
            var dataTable = new DataTable("test");
            dataTable.Columns.Add(new DataColumn("ID", typeof(int)));
            dataTable.Columns.Add(new DataColumn("Name", typeof(string)));

            var row1 = dataTable.NewRow();
            row1["ID"] = 1;
            row1["Name"] = "John Smith";
            dataTable.Rows.Add(row1);

            var row2 = dataTable.NewRow();
            row2["ID"] = 2;
            row2["Name"] = "Mary Williams";
            dataTable.Rows.Add(row2);

            Dictionary<string, object> result = new Dictionary<string, object> {
                ["Columns"] = dataTable.Columns.Cast<DataColumn>().Select(x => new Dictionary<string, object> { [x.ColumnName] = x.DataType.Name }).ToArray(),
                ["Rows"] = dataTable.Rows.Cast<DataRow>().Select(x => x.ItemArray).ToArray()
            };
            var json = JsonConvert.SerializeObject(result);
            Console.WriteLine($"json={json}");
        }

    }
}