2011-10-03 87 views
5

¿Alguien sabe cómo convertir una cadena json en DataTable de asp.net? Llegué a saber sobre el Deserialize, necesita la clase, solo quiero que la datatable sea devuelta. ¿Alguien puede decirme cómo convertirlo a tabla de datos?Cómo convertir json en tabla de datos?

Respuesta

15

Suponiendo que la cadena de JSON es una lista de objetos, cada objeto se corresponderá con una fila de la DataTable, a saber:

public DataTable DerializeDataTable() 
    { 
     const string json = @"[{""Name"":""AAA"",""Age"":""22"",""Job"":""PPP""}," 
          + @"{""Name"":""BBB"",""Age"":""25"",""Job"":""QQQ""}," 
          + @"{""Name"":""CCC"",""Age"":""38"",""Job"":""RRR""}]"; 
     var table = JsonConvert.DeserializeObject<DataTable>(json); 
     return table; 
    } 

tal fin es necesario Json.NET framework.

Si su estructura JSON es diferente, publíquela. Atentamente.

+0

Has encontrado la solución. Estoy enfrentando el mismo problema. 'La cadena de entrada no estaba en el formato correcto. No se pudo almacenar <6.94127> en Latitude Co lumn. El tipo esperado es Int64'. Estoy usando Newtonsoft.Json.dll. ¿alguna solución? – Piraba

+0

La DataTable incorporada no serializa la información de la columna, tiene que inferir el tipo de columna de los datos. He creado un convertidor mejorado aquí https://github.com/chris-herring/DataTableConverter –

0

no estoy seguro de qué biblioteca JSON que está utilizando, pero es posible que desee echar un vistazo a JSON.NET ya que hay un tipo de convertidor objeto allí llamado a esto:

Newtonsoft.Json.Converters.DataTableConverter 
    // Summary: 
    //  Converts a System.Data.DataTable to and from JSON. 

No he utilizado esta funcionalidad antes, pero podría tener un ir con ella.

0

Es simple.

Si está en framework 2.0, debe importar json.net (http://json.codeplex.com/) en su proyecto, si su framework es superior, tiene json.

El código en marco vb.net 2,0:

Dim Table DataTable 

Table = Json.JsonConvert.DeserializeObject(Of DataTable)(Json_string) 

Eso es todo.

+0

Tenga cuidado json.net (http://json.codeplex.com/), no respeta table.tablename y claves principales . Debes hacerlo después de convertir el db. – AAP

2

Esta pregunta está desactualizada, pero alguien puede estar buscando respuestas, así que aquí va. No funcionó con el viejo JSON.NET, pero hoy me actualicé a la última versión y viola! Funciona muy bien.

¡Hemos serializado una DataTable en Json de ida y vuelta, cero problemas! Esta es una característica nueva impresionante.

Espero que ayude a los demás también. Aclamaciones.

5
using Newtonsoft.Json; 

string json = "[{"clientID":"1788","projectID":"19"},{"clientID":"1789","projectID":"24"},{"clientID":"1790","projectID":"24"},{"clientID":"1790","projectID":"23"},{"clientID":"1790","projectID":"21"}]"; 

DataTable tester = (DataTable) JsonConvert.DeserializeObject(json, (typeof(DataTable))); 

Código de la forma anteriormente

public object Deserialize(string jsonText, Type valueType) 
{ 
    try 
    { 
     Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer(); 

     json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
     json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace; 
     json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore; 
     json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

     StringReader sr = new StringReader(jsonText); 

     Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr); 
     object result = json.Deserialize(reader, valueType); 
     reader.Close(); 
     return result; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 


} 

Deserialize su jsonString a alguna clase

List<User> UserList = JsonConvert.DeserializeObject<User>(jsonString); 

Escribir siguiente método de extensión a su proyecto

public static DataTable ToDataTable<T>(this IList<T> data) 
{ 
    PropertyDescriptorCollection props = 
    TypeDescriptor.GetProperties(typeof(T)); 
    DataTable table = new DataTable(); 
    for(int i = 0 ; i < props.Count ; i++) 
    { 
    PropertyDescriptor prop = props[i]; 
    table.Columns.Add(prop.Name, prop.PropertyType); 
    } 
    object[] values = new object[props.Count]; 
    foreach (T item in data) 
    { 
    for (int i = 0; i < values.Length; i++) 
    { 
     values[i] = props[i].GetValue(item); 
    } 
    table.Rows.Add(values); 
    } 
    return table;   
} 

llamada método de extensión como

UserList.ToDataTable<User>(); 
+0

Estoy tratando de usar el método de extensión anterior: sin errores en la compilación. Pero obtengo un error de compilación: "Mensaje de error del compilador: CS0121: la llamada es ambigua entre los siguientes métodos o propiedades: 'ExtensionHelpers.ToDataTable <_Default.Jobs> (System.Collections.Generic.IList <_D efault.Jobs>) 'y' ExtensionHelpers.ToDataTable <_Default.Jobs> (System.Collections.Generic.IList <_D efault.Jobs>) '"¿Tiene alguna idea de lo que podría estar causando? –