2012-06-21 11 views
5

Ho pensato che il seguente sarebbe stato un compito abbastanza comune e presupposto che ci sarebbe stata una soluzione facile per questo, ma non riesco a trovarne uno.Converti DataTable in JSON con la chiave per riga

Se ho un datatable nella seguente struttura.

ID Name Active 
ID1 John TRUE 
ID2 Bill FALSE 

Vorrei serializzare come un oggetto JSON in cui la colonna ID è un nodo in oggetto JSON come:

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

ho guardato in JSON.NET, ma non sono riuscito a farlo funzionare . Modifica: sto usando C#

+0

Questo non accadrà da solo. In che lingua stai lavorando? – lanzz

+0

Hmm giusto dimenticato di citare C#, thx. – Arnoldiusss

+2

Hai guardato questo? http://stackoverflow.com/questions/451460/datatable-to-json – Blueberry

risposta

20

Questo è abbastanza semplice con JSON.NET. Basta convertire il vostro tavolo dati nel dizionario equivalente di dizionari:

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])); 
} 

quindi chiamare:

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

Ecco la prova completa:

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")); 

E il risultato:

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

Grazie, ottimo metodo di supporto! grazie per l'esempio completo. – Arnoldiusss

0

Utilizzo di 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();