Heim >Backend-Entwicklung >C++ >Wie kann Json.NET Stream große JSON-Dateien effizient deserialisieren, um die Speichernutzung zu minimieren?

Wie kann Json.NET Stream große JSON-Dateien effizient deserialisieren, um die Speichernutzung zu minimieren?

Susan Sarandon
Susan SarandonOriginal
2025-01-19 01:42:091008Durchsuche

How Can Json.NET Stream Deserialize Large JSON Files Efficiently to Minimize Memory Usage?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn