2011-10-03 41 views
5

Qualcuno sa come convertire una stringa json in DataTable da asp.net? Sono venuto a conoscenza della deserializzazione, ha bisogno della classe, voglio solo il datatable come restituito. Qualcuno può dirmi come convertirlo in datatable?Come convertire JSON in datatable?

risposta

15

Supponendo che la stringa JSON è un elenco di oggetti, ogni oggetto sarà conforme a una riga nella DataTable, cioè:

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

Ciò richiede l'Json.NET framework.

Se la struttura JSON è diversa, si prega di postarla. I migliori saluti.

+0

Hai trovato la soluzione. Sto affrontando lo stesso problema. 'La stringa di input non era in un formato corretto. Non è possibile memorizzare <6.94127> in Latitude Co lumn. Il tipo previsto è Int64'. Sto usando Newtonsoft.Json.dll. qualche soluzione? – Piraba

+0

Il DataTable incorporato non serializza le informazioni sulle colonne, deve inferire il tipo di colonna dai dati. Ho creato un convertitore migliorato qui https://github.com/chris-herring/DataTableConverter –

0

non sono sicuro quale libreria JSON che si sta utilizzando, ma si potrebbe desiderare di dare un'occhiata a JSON.NET in quanto v'è un tipo di oggetto convertitore in là chiamato questo:

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

Non ho usato questa funzionalità prima, ma potresti provarla.

0

È semplice.

Se si è nel framework 2.0, è necessario importare json.net (http://json.codeplex.com/) nel progetto, se il framework è superiore, ha json.

Il codice in vb.net framework 2.0:

Dim Table DataTable 

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

Questo è tutto.

+0

Be carefull json.net (http://json.codeplex.com/), non rispetta table.tablename e le chiavi primarie . Devi asserirlo dopo aver convertito il db. – AAP

2

Questa domanda è in qualche modo obsoleta, ma qualcuno potrebbe cercare risposte, quindi ecco qui. Non ha funzionato con il vecchio JSON.NET, ma oggi ho aggiornato alla versione più recente e viola! Funziona alla grande.

Hanno serializzato un DataTable in JSON avanti e indietro, zero problemi! Questa è una nuova fantastica funzionalità.

Spero che aiuti anche gli altri. Saluti.

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

Codice per il metodo di cui sopra

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


} 

deserializzare tua jsonstring a qualche classe

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

Scrivi seguente metodo di estensione per il vostro progetto

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

chiamata metodo di estensione come

UserList.ToDataTable<User>(); 
+0

Sto provando a utilizzare il metodo di estensione sopra riportato - Nessun errore durante la compilazione. Ma ottengo un errore di compilazione: "Messaggio di errore del compilatore: CS0121: la chiamata è ambigua tra i seguenti metodi o proprietà: 'ExtensionHelpers.ToDataTable <_Default.Jobs> (System.Collections.Generic.IList <_D efault.Jobs>) 'e' ExtensionHelpers.ToDataTable <_Default.Jobs> (System.Collections.Generic.IList <_D efault.Jobs>) '"Hai idea di cosa potrebbe causarlo? –

Problemi correlati