Json.NET verarbeitet große JSON-Streams in einer speicherbeschränkten Umgebung
Das Parsen von JSON-Dateien, die eine große Anzahl ähnlicher Objekte enthalten, ist in einer Umgebung mit begrenztem Speicher eine Herausforderung. Stellen Sie sich das folgende Szenario vor:
Eine riesige JSON-Datei enthält viele JSON-Objekte mit derselben Struktur. Wenn jedes Objekt eine separate Datei ist, können Sie die Objekte einzeln deserialisieren. Aufgrund der verschachtelten Natur der Daten wird jedoch beim direkten Deserialisieren eines JSON-Arrays dieser Objekte eine Ausnahme ausgelöst, die besagt, dass ein Objekt und nicht eine Liste erwartet wurde.
Der Versuch, die gesamte JSON-Datei in eine Liste von C#-Objekten zu deserialisieren, vermeidet erfolgreich das Problem des Einlesens der gesamten JSON-Datei in den RAM. Es entsteht jedoch ein neues Problem bei der Erstellung eines C#-Listenobjekts, das weiterhin alle Daten aus der JSON-Datei im Speicher enthält.
Um diese Einschränkungen zu überwinden, ist eine Strategie erforderlich, um Objekte einzeln zu lesen. Durch diesen Ansatz entfällt die Notwendigkeit, den gesamten JSON-String oder alle Daten als C#-Objekt in den RAM zu laden.
Lösung
Das folgende Codebeispiel veranschaulicht diesen Ansatz:
<code class="language-csharp">JsonSerializer serializer = new JsonSerializer(); MyObject o; using (FileStream s = File.Open("bigfile.json", FileMode.Open)) using (StreamReader sr = new StreamReader(s)) using (JsonReader reader = new JsonTextReader(sr)) { while (reader.Read()) { // 只在流中存在"{"字符时才反序列化 if (reader.TokenType == JsonToken.StartObject) { o = serializer.Deserialize<MyObject>(reader); // 对o进行处理 } } }</code>
Dieser Code simuliert die anfängliche Methode der Deserialisierung des Objekts in einer Schleife, deserialisiert das Objekt jedoch nur, wenn der Leser im Stream auf ein „{“-Zeichen stößt. Dieser Ansatz verarbeitet JSON-Streams effizient, ohne RAM zu stark zu beanspruchen, indem zum nächsten Objekt gesprungen wird, bis eine andere Startobjektmarkierung gefunden wird. Beachten Sie, dass myobject
im Code zu MyObject
korrigiert wurde und Kommentare zur Verarbeitung des o
-Objekts hinzugefügt wurden, um Benutzern das Hinzufügen nachfolgender Vorgänge entsprechend der tatsächlichen Situation zu erleichtern.
Das obige ist der detaillierte Inhalt vonWie kann ich große JSON-Streams mit begrenztem RAM in Json.NET effizient analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!