Leggi e analizza un file Json in C #

Ho passato la parte migliore di due giorni a “fare i conti con esempi di codice e così via, cercando di leggere un file JSON molto grande in un array in c #, così posso dividerlo in seguito in un array 2d per l’elaborazione.

Il problema che stavo avendo era che non riuscivo a trovare nessun esempio di persone che facevano quello che stavo cercando di fare. Questo significava che stavo solo modificando il codice un po ‘sperando per il meglio.

Sono riuscito a ottenere qualcosa di funzionante che:

  • Leggi il file Manca le intestazioni e legge solo i valori nell’array.
  • Posiziona una certa quantità di valori su ciascuna riga di un array. (Quindi in seguito ho potuto dividerlo in un array 2d)

Questo è stato fatto con il codice qui sotto, ma si blocca il programma dopo aver inserito alcune linee nella matrice. Questo potrebbe avere a che fare con le dimensioni del file.

// If the file extension was a jave file the following // load method will be use else it will move on to the // next else if statement if (fileExtension == ".json") { int count = 0; int count2 = 0; int inOrOut = 0; int nRecords=1; JsonTextReader reader = new JsonTextReader(new StreamReader(txtLoaction.Text)); string[] rawData = new string[5]; while (reader.Read()) { if (reader.Value != null) if (inOrOut == 1) { if (count == 6) { nRecords++; Array.Resize(ref rawData, nRecords); //textBox1.Text += "\r\n"; count = 0; } rawData[count2] += reader.Value + ","; //+"\r\n" inOrOut = 0; count++; if (count2 == 500) { MessageBox.Show(rawData[499]); } } else { inOrOut = 1; } } } 

Un frammento del JSON con cui sto lavorando è:

 [ { "millis": "1000", "stamp": "1273010254", "datetime": "2010/5/4 21:57:34", "light": "333", "temp": "78.32", "vcc": "3.54" }, ] 

Ho bisogno dei valori di questo JSON. Ad esempio, ho bisogno di “3.54”, ma non vorrei che stampasse il “vcc”.

Spero che qualcuno possa mostrarmi come leggere un file JSON e solo estrarre i dati di cui ho bisogno e metterli in una matrice o qualcosa che posso usare per poi inserirli in un array.

Che ne dici di rendere tutte le cose più facili?

 public void LoadJson() { using (StreamReader r = new StreamReader("file.json")) { string json = r.ReadToEnd(); List items = JsonConvert.DeserializeObject>(json); } } public class Item { public int millis; public string stamp; public DateTime datetime; public string light; public float temp; public float vcc; } 

Puoi persino ottenere i valori alleati dynamic senza dichiarare la class Item .

 dynamic array = JsonConvert.DeserializeObject(json); foreach(var item in array) { Console.WriteLine("{0} {1}", item.temp, item.vcc); } 

Fare questo te stesso è un’idea orribile. Usa Json.NET . Ha già risolto il problema meglio di quanto potrebbe fare la maggior parte dei programmatori se fossero stati messi a lavorare per mesi. Per quanto riguarda le tue esigenze specifiche, l’analisi in array e così via, controlla la documentazione , in particolare su JsonTextReader . Fondamentalmente, JSON.NET gestisce in modo nativo gli array JSON e li analizzerà in stringhe, inte o qualsiasi altro tipo di problema non richieda all’utente. Ecco un link diretto agli usi del codice di base sia per il lettore che per lo scrittore, quindi puoi aprirlo in una finestra di riserva mentre stai imparando a lavorare con questo.

Questo è il meglio: sii pigro questa volta e usa una biblioteca per risolvere per sempre questo problema comune .

Basato sulla soluzione di @ LB, il codice VB (tipizzato come Object piuttosto che Anonymous ) è

 Dim oJson as Object = JsonConvert.DeserializeObject(File.ReadAllText(MyFilePath)) 

Devo dire che questo è veloce e utile per la costruzione di contenuti di chiamate HTTP dove il tipo non è richiesto. E l’uso di Object piuttosto che di Anonymous significa che puoi mantenere Option Strict On nel tuo ambiente Visual Studio – odio distriggersrlo.

Per trovare la strada giusta che sto usando

  var pathToJson = Path.Combine("my","path","config","default.Business.Area.json"); var r = new StreamReader(pathToJson); var myJson = r.ReadToEnd(); // my/path/config/default.Business.Area.json [...] do parsing here 

Path.Combine utilizza Path.PathSeparator e controlla se il primo percorso ha già un separatore alla fine in modo da non duplicare i separatori. Inoltre, controlla se gli elementi del percorso da combinare hanno caratteri non validi.

Vedi https://stackoverflow.com/a/32071002/4420355