【问题标题】:Convert DataTable to JSON with key per row使用每行键将 DataTable 转换为 JSON
【发布时间】:2012-06-23 16:19:46
【问题描述】:

我认为以下将是一项非常常见的任务,并认为会有一个简单的解决方案,但我找不到。

如果我有以下结构的数据表。

ID  Name    Active
ID1 John    TRUE
ID2 Bill    FALSE

我想将它序列化为一个 JSON 对象,其中 ID 列是 JSON 对象中的一个节点,例如:

[
    {
        "ID1": {
            "Name": "John",
            "Active": "True"
        },
        "ID2": {
            "Name": "Bill",
            "Active": "False"
        }
    }
]

我查看了 JSON.NET,但无法让它工作。 编辑:我正在使用 C#

【问题讨论】:

标签: c# json serialization datatable json.net


【解决方案1】:

这对于 JSON.NET 来说非常简单。只需将您的数据表转换为等效的字典即可:

public Dictionary<string, Dictionary<string, object>> DatatableToDictionary(DataTable dt, string id)
{
    var cols = dt.Columns.Cast<DataColumn>().Where(c => c.ColumnName != id);
    return dt.Rows.Cast<DataRow>()
             .ToDictionary(r => r[id].ToString(), 
                           r => cols.ToDictionary(c => c.ColumnName, c => r[c.ColumnName]));
}

然后调用:

JsonConvert.SerializeObject(DatatableToDictionary(dt, "ID"), Newtonsoft.Json.Formatting.Indented);

这是完整的测试:

var dt = new DataTable("MyTable");
dt.Columns.Add("ID");
dt.Columns.Add("Name");
dt.Columns.Add("Active");

dt.LoadDataRow(new[] {"ID1", "John", "True"}, true);
dt.LoadDataRow(new[] {"ID2", "Bill", "False"}, true);

JsonConvert.SerializeObject(DatatableToDictionary(dt, "ID"));

结果:

{
  "ID1": {
    "Name": "John",
    "Active": "True"
  },
  "ID2": {
    "Name": "Bill",
    "Active": "False"
  }
}

【讨论】:

  • 谢谢,好帮手的方法!谢谢完整的例子。
【解决方案2】:

使用 JSON.NET (Newtonsoft.Json.Linq)

var obj = new JObject(
    dataTable.Rows.Cast<DataRow>()
         .Select(r => new JProperty(r["ID"].ToString(),
                 new JObject(
                     new JProperty("Name", r["Name"].ToString()),
                     new JProperty("Active", r["Active"].ToString())
                 )
             ))
);

// Convert the JObject to a JSON string
var json = obj.ToString();

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2013-03-26
    相关资源
    最近更新 更多