Heim >Backend-Entwicklung >C++ >Wie kann Json.NET Stream große JSON-Dateien effizient deserialisieren, um die Speichernutzung zu minimieren?
Json.NET-Streaming-Deserialisierung: Effiziente Verarbeitung großer JSON-Dateien
Bei großen JSON-Dateien, die viele identische Objekte enthalten, ist es wichtig, das Laden der gesamten Datei in den Speicher zu vermeiden. Json.NET bietet eine Möglichkeit, JSON-Inhalte direkt aus dem Stream zu deserialisieren und so den Speicherverbrauch erheblich zu reduzieren.
Erste Versuche und Einschränkungen
Durch die Deserialisierung des Objekts direkt in der Schleife wird die Datei als einzelnes Objekt behandelt, was aufgrund des Vorhandenseins der Root-JSON-Liste fehlschlägt. Die Deserialisierung von JSON in eine C#-Liste ist zwar möglich, Elemente einzeln zu lesen, verbraucht aber dennoch viel Speicher, da die Liste alle deserialisierten Objekte enthält.
Streaming-Deserialisierung
Um Objekte im Stream sequentiell zu lesen, muss die Startposition jedes Objekts identifiziert und entsprechend deserialisiert werden. Dies kann durch die Verwendung des reader.TokenType
-Attributs innerhalb einer Schleife erreicht werden:
<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 deserialisiert nur, wenn der Leser auf den Anfang des Objekts ({) stößt. Das Überspringen anderer Markierungen gewährleistet ein effizientes Parsen großer Dateien, ohne unnötig RAM zu verbrauchen. Der // 处理对象 o
-Kommentar wird dem Code hinzugefügt, um die Leser daran zu erinnern, dass das gelesene MyObject
-Objekt nach der Deserialisierung tatsächlich verarbeitet werden muss.
Das obige ist der detaillierte Inhalt vonWie kann Json.NET Stream große JSON-Dateien effizient deserialisieren, um die Speichernutzung zu minimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!