Вопрос по datatable, json.net, serialization, c#, json – Конвертировать DataTable в JSON с ключом на строку

5

Я думал, что следующее будет довольно распространенной задачей, и предполагал, что для нее будет простое решение, но я не могу его найти.

Если у меня есть дата в следующей структуре.

ID  Name    Active
ID1 John    TRUE
ID2 Bill    FALSE

Я хотел бы сериализовать его как объект JSON, где столбец идентификатора является узлом в объекте JSON, например:

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

Я посмотрел в JSON.NET, но не смог заставить его работать. Изменить: я использую C #

И это:west-wind.com/weblog/posts/2008/Sep/03/… Blueberry
Вы смотрели на это?stackoverflow.com/questions/451460/datatable-to-json Blueberry
Хм, верно, забыл упомянуть C #, спасибо. Arnoldiusss
Это не произойдет само по себе. На каком языке вы работаете? lanzz

Ваш Ответ

2   ответа
0

Используя 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();
20

Это довольно просто с 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"
  }
}
Спасибо, отличный вспомогательный метод! Спасибо за полный пример. Arnoldiusss

Похожие вопросы