it-swarm.com.de

Lesen und Parsen einer Json-Datei in C #

Ich habe den größten Teil von zwei Tagen damit verbracht, mich mit Codebeispielen usw. zu beschäftigen und zu versuchen, eine sehr große JSON-Datei in ein Array in c # zu lesen, damit ich sie später zur Verarbeitung in ein 2D-Array aufteilen kann.

Das Problem, das ich hatte, war, dass ich keine Beispiele für Leute finden konnte, die das taten, was ich versuchte. Dies bedeutete, dass ich nur ein wenig Code bearbeitete und auf das Beste hoffte.

Ich habe es geschafft, etwas zum Laufen zu bringen, das:

  • Lesen Sie die Datei. Lassen Sie die Header aus und lesen Sie nur Werte in das Array.
  • Platzieren Sie eine bestimmte Anzahl von Werten in jeder Zeile eines Arrays. (So ​​konnte ich es später teilen und in 2d Array setzen)

Dies geschah mit dem folgenden Code, aber das Programm stürzt ab, nachdem ein paar Zeilen in das Array eingegeben wurden. Dies kann mit der Dateigröße zusammenhängen.

// 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 aus dem 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 "vcc" gedruckt wird.

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

191
Chris Devine

Wie wäre es, all die Dinge mit Json.NET einfacher zu machen?

public void LoadJson()
{
    using (StreamReader r = new StreamReader("file.json"))
    {
        string json = r.ReadToEnd();
        List<Item> items = JsonConvert.DeserializeObject<List<Item>>(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 sogar die Werte dynamically abrufen, ohne Item class zu deklarieren.

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

Dies selbst zu tun ist eine schreckliche Idee. Verwenden Sie Json.NET . Es hat das Problem bereits besser gelöst als die meisten Programmierer, wenn sie monatelang Zeit hätten, daran zu arbeiten. Überprüfen Sie die Dokumentation für Ihre spezifischen Anforderungen, die Analyse in Arrays und dergleichen, insbesondere auf JsonTextReader. Grundsätzlich behandelt Json.NET JSON-Arrays nativ und zerlegt sie in Strings, Ints oder was auch immer der Typ sein mag, ohne dass Sie dazu aufgefordert werden. Hier ist ein direkter Link zu den grundlegenden Code-Verwendungen sowohl für den Leser als auch für den Schreiber, sodass Sie diese in einem Ersatzfenster öffnen können, während Sie lernen, damit zu arbeiten.

Dies ist das Beste: Seien Sie dieses Mal faul und nutzen Sie eine Bibliothek, damit Sie dieses häufig auftretende Problem für immer lösen können .

39
tmesser

Basierend auf der Lösung von @ L.B. lautet der (als Object anstelle von 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 erforderlich ist. Und die Verwendung von Object anstelle von Anonymous bedeutet, dass Sie Option Strict On in Ihrer Visual Studio-Umgebung beibehalten können - ich hasse es, das zu deaktivieren.

9
SteveCinq
string jsonFilePath = @"C:\MyFolder\myFile.json";

        string json = File.ReadAllText(jsonFilePath);
        Dictionary<string, object> json_Dictionary = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(json);

        foreach (var item in json_Dictionary)
        {
            // parse here
        }
3
user3192640

Um den richtigen Weg zu finden, benutze ich

   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 prüft, ob der erste Pfad am Ende bereits ein Trennzeichen enthält, damit die Trennzeichen nicht dupliziert werden. Außerdem wird geprüft, ob die zu kombinierenden Pfadelemente ungültige Zeichen enthalten.

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

1
kuzdu