Come deserializzare i dati JSON?

Sono nuovo a lavorare con i dati JSON.

Sto leggendo i dati da un servizio web. I dati della query restituiti sono i seguenti:

[["B02001_001E","NAME","state"], ["4712651","Alabama","01"], ["691189","Alaska","02"], ["6246816","Arizona","04"], ["18511620","Florida","12"], ["9468815","Georgia","13"], ["1333591","Hawaii","15"], ["1526797","Idaho","16"], ["3762322","Puerto Rico","72"]] 

C’è un modo per Deserializzare questi dati in modo tale che l’object di base verrà generato senza che io definisca prima come è l’object? Nell’esempio sopra l’object è definito dalla prima riga:

  ["B02001_001E","NAME","state"], 

In generale, il servizio Web restituirà i dati della query formattati come un array JSON bidimensionale in cui la prima riga fornisce i nomi delle colonne e le righe successive forniscono i valori dei dati.

Puoi deserializzare questo facilmente. La struttura dei dati in C # è solo List quindi puoi semplicemente fare;

  List data = JsonConvert.DeserializeObject>(jsonString); 

Il codice precedente presuppone che tu stia utilizzando json.NET.

EDIT: Nota che JSON è tecnicamente una serie di array di stringhe. Preferisco usare List per la mia dichiarazione perché è più intuitivo. Non causerà alcun problema a json.NET, se vuoi che sia una matrice di array di stringhe allora devi cambiare il tipo in (credo) string[][] ma ci sono alcuni divertenti trucchi con jagged e Array 2D in C # di cui non sono a conoscenza, quindi non mi preoccupo di occuparmene qui.

Se usi .Net 4.5 puoi anche usare serializer .Net standard.

 using System.Runtime.Serialization.Json; ... Stream jsonSource = ...; // serializer will read data stream var s = new DataContractJsonSerializer(typeof(string[][])); var j = (string[][])s.ReadObject(jsonSource); 

In .Net 4.5 e versioni precedenti è ansible utilizzare la class JavaScriptSerializer:

 using System.Web.Script.Serialization; ... JavaScriptSerializer serializer = new JavaScriptSerializer(); string[][] list = serializer.Deserialize(json); 

Passo 1: vai su json.org per trovare la libreria JSON per qualsiasi tecnologia tu stia utilizzando per chiamare questo servizio web. Scarica e collega a quella libreria.

Passaggio 2: Diciamo che stai usando Java. Dovresti usare JSONArray in questo modo:

 JSONArray myArray=new JSONArray(queryResponse); for (int i=0;i 

Puoi scrivere il tuo parser JSON e renderlo più generico in base alle tue esigenze. Ecco uno che ha ben servito il mio scopo, la speranza ti aiuterà anche tu.

 class JsonParsor { public static DataTable JsonParse(String rawJson) { DataTable dataTable = new DataTable(); Dictionary outdict = new Dictionary(); StringBuilder keybufferbuilder = new StringBuilder(); StringBuilder valuebufferbuilder = new StringBuilder(); StringReader bufferreader = new StringReader(rawJson); int s = 0; bool reading = false; bool inside_string = false; bool reading_value = false; bool reading_number = false; while (s >= 0) { s = bufferreader.Read(); //open JSON if (!reading) { if ((char)s == '{' && !inside_string && !reading) { reading = true; continue; } if ((char)s == '}' && !inside_string && !reading) break; if ((char)s == ']' && !inside_string && !reading) continue; if ((char)s == ',') continue; } else { if (reading_value) { if (!inside_string && (char)s >= '0' && (char)s <= '9') { reading_number = true; valuebufferbuilder.Append((char)s); continue; } } //if we find a quote and we are not yet inside a string, advance and get inside if (!inside_string) { if ((char)s == '\"' && !inside_string) inside_string = true; if ((char)s == '[' && !inside_string) { keybufferbuilder.Length = 0; valuebufferbuilder.Length = 0; reading = false; inside_string = false; reading_value = false; } if ((char)s == ',' && !inside_string && reading_number) { if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); keybufferbuilder.Length = 0; valuebufferbuilder.Length = 0; reading_value = false; reading_number = false; } continue; } //if we reach end of the string if (inside_string) { if ((char)s == '\"') { inside_string = false; s = bufferreader.Read(); if ((char)s == ':') { reading_value = true; continue; } if (reading_value && (char)s == ',') { //put the key-value pair into dictionary if(!dataTable.Columns.Contains(keybufferbuilder.ToString())) dataTable.Columns.Add(keybufferbuilder.ToString(),typeof(string)); if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); keybufferbuilder.Length = 0; valuebufferbuilder.Length = 0; reading_value = false; } if (reading_value && (char)s == '}') { if (!dataTable.Columns.Contains(keybufferbuilder.ToString())) dataTable.Columns.Add(keybufferbuilder.ToString(), typeof(string)); if (!outdict.ContainsKey(keybufferbuilder.ToString())) outdict.Add(keybufferbuilder.ToString(), valuebufferbuilder.ToString()); ICollection key = outdict.Keys; DataRow newrow = dataTable.NewRow(); foreach (string k_loopVariable in key) { CommonModule.LogTheMessage(outdict[k_loopVariable],"","",""); newrow[k_loopVariable] = outdict[k_loopVariable]; } dataTable.Rows.Add(newrow); CommonModule.LogTheMessage(dataTable.Rows.Count.ToString(), "", "row_count", ""); outdict.Clear(); keybufferbuilder.Length=0; valuebufferbuilder.Length=0; reading_value = false; reading = false; continue; } } else { if (reading_value) { valuebufferbuilder.Append((char)s); continue; } else { keybufferbuilder.Append((char)s); continue; } } } else { switch ((char)s) { case ':': reading_value = true; break; default: if (reading_value) { valuebufferbuilder.Append((char)s); } else { keybufferbuilder.Append((char)s); } break; } } } } return dataTable; } }