2012-06-21 61 views
5

Pensé que la siguiente sería una tarea bastante común y asumí que habría una solución fácil para ella, pero no puedo encontrar una.Convertir DataTable a JSON con clave por fila

Si tengo una tabla de datos en la siguiente estructura.

ID Name Active 
ID1 John TRUE 
ID2 Bill FALSE 

me gustaría serializarlo como un objeto JSON que la columna de ID es un nodo en el objeto JSON como:

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

Miré en JSON.NET pero no pude conseguir que funcione . Editar: Estoy usando C#

+0

Esto no sucederá solo. ¿En qué idioma estás trabajando? – lanzz

+0

Hmm, se olvidó de mencionar C#, thx. – Arnoldiusss

+2

¿Has mirado esto? http://stackoverflow.com/questions/451460/datatable-to-json – Blueberry

Respuesta

20

Esto es bastante simple con JSON.NET. Sólo convertir la tabla de datos en el diccionario equivalente de diccionarios:

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

luego llamar a:

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

Aquí está la prueba 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")); 

Y el resultado:

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

Gracias, gran método de ayuda! Gracias por el ejemplo completo. – Arnoldiusss

0

Usando 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();