Lesen und analysieren Sie eine JSON-Datei in C #

Ich habe den besten Teil von zwei Tagen damit verbracht, mit Codebeispielen und so weiter zu “fischen” und versuche, eine sehr große JSON-Datei in ein Array in c # zu lesen, damit ich sie später in ein 2d-Array zur Verarbeitung aufteilen kann.

Das Problem, das ich hatte, war, dass ich keine Beispiele von Leuten finden konnte, die das taten, was ich versuchte. Das bedeutete, dass ich nur ein wenig Code editierte und auf das Beste hoffte.

Ich habe etwas geschafft, das funktioniert:

  • Lesen Sie die Datei Header auslassen und nur Werte in Array lesen.
  • Legen Sie eine bestimmte Anzahl von Werten in jede Zeile eines Arrays. (So ​​könnte ich es später in ein 2d Array teilen)

Dies wurde mit dem folgenden Code gemacht, aber es stürzt das Programm ab, nachdem ein paar Zeilen in das Array eingegeben wurden. Dies hat möglicherweise mit der Dateigröße zu tun.

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

Ein Ausschnitt des JSON, mit dem ich arbeite, ist:

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

Ich brauche die Werte aus diesem JSON. Zum Beispiel brauche ich “3.54”, aber ich möchte nicht, dass es den “vcc” druckt.

Ich hoffe, dass jemand mir zeigen kann, wie man eine JSON-Datei liest und nur die Daten entzifferte, die ich brauche, und es in ein Array oder etwas, das ich später in ein Array einfügen kann, einlege.

Wie wäre es, all die Dinge einfacher zu machen?

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

Sie können die Werte sogar dynamic , ohne die Item class zu deklarieren.

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

Tun Sie das selbst ist eine schreckliche Idee. Verwenden Sie Json.NET . Es hat das Problem bereits besser getriggers als die meisten Programmierer, wenn sie monatelang arbeiten würden. Was Ihre speziellen Anforderungen JsonTextReader , analysieren Sie in Arrays und so weiter, überprüfen Sie die Dokumentation , insbesondere auf JsonTextReader . Grundsätzlich behandelt Json.NET JSON-Arrays nativ und analysiert sie in Strings, Ints oder was auch immer der Typ passiert, ohne dass Sie dazu aufgefordert werden. Hier ist eine direkte Verbindung zu den grundlegenden Code-Verwendungen für den Leser und den Schreiber, so dass Sie diese in einem Ersatzfenster öffnen können, während Sie lernen, damit zu arbeiten.

Das ist das Beste: Sei dieses Mal faul und benutze eine Bibliothek, um dieses Problem für immer zu lösen .

Basierend auf der @ LB-Lösung ist der (als Object und nicht als Anonymous eingegebene) VB-Code

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

Ich sollte erwähnen, dass dies schnell und nützlich ist, um HTTP-Aufrufinhalte zu erstellen, bei denen der Typ nicht benötigt wird. Und wenn Sie Object anstelle von Anonymous , können Sie Option Strict On in Ihrer Visual Studio-Umgebung beibehalten – ich hasse es, das zu deaktivieren.

Um den richtigen Weg zu finden, den ich benutze

  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 verwendet den Path.PathSeparator und überprüft, ob der erste Pfad am Ende bereits ein Trennzeichen enthält, damit die Trennzeichen nicht dupliziert werden. Darüber hinaus wird überprüft, ob die zu kombinierenden Pfadelemente ungültige Zeichen enthalten.

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