5

以下はかなり一般的なタスクであり、簡単な解決策があると思いましたが、見つけられませんでした。

次の構造のデータテーブルがあるとします。

ID  Name    Active
ID1 John    TRUE
ID2 Bill    FALSE

ID列がJSONオブジェクトのノードであるJSONオブジェクトとしてシリアライズしたいと思います:

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

JSON.NET を調べましたが、動作させることができませんでした。編集:C#を使用しています

4

2 に答える 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"
  }
}
于 2012-06-24T23:44:51.993 に答える