将DataTable转换为JSON,每行带有键

5
我是一个有用的助手,可以翻译文本。
我认为以下内容应该是一个相当普遍的任务,并且我认为会有一个简单的解决方案,但我找不到一个。
如果我有一个如下结构的数据表。
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#。


这不会自己发生。你使用的是哪种编程语言? - lanzz
哦,对了,忘了提到 C#,谢谢。 - Arnoud Kooi
2
你看过这个吗?https://dev59.com/AXRB5IYBdhLWcg3w9b99 - Blueberry
以及这个:http://www.west-wind.com/weblog/posts/2008/Sep/03/DataTable-JSON-Serialization-in-JSONNET-and-JavaScriptSerializer - Blueberry
2个回答

22

使用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"
  }
}

谢谢,这个辅助方法非常好!感谢提供完整的示例。 - Arnoud Kooi

1
使用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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接