Maison >développement back-end >C++ >Comment Json.NET peut-il diffuser la désérialisation JSON pour traiter efficacement des fichiers volumineux ?

Comment Json.NET peut-il diffuser la désérialisation JSON pour traiter efficacement des fichiers volumineux ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-19 01:51:09742parcourir

How Can Json.NET Stream JSON Deserialization to Process Large Files Efficiently?

Traitement efficace des gros fichiers JSON : désérialisation du streaming Json.NET

Une analyse efficace est essentielle lorsqu'il s'agit de grands ensembles de données JSON qui ne peuvent pas être entièrement chargés en mémoire. Json.NET fournit une puissante solution de traitement de données JSON en streaming via son JsonReader.

Aperçu du problème

Un fichier JSON contient une séquence d'objets identiques, le but est de lire un objet à la fois sans charger l'intégralité du fichier en mémoire.

Tentative échouée

La tentative initiale de désérialiser le fichier a entraîné une exception car un tableau JSON était attendu, pas un objet. La désérialisation du tableau en liste a résolu l'erreur mais a entraîné une consommation de mémoire élevée.

Solutions de streaming

Pour contourner ces limitations, la solution proposée lit le fichier JSON caractère par caractère et ne désérialise l'objet que lorsque le lecteur rencontre le caractère "{" indiquant le début de l'objet.

Exemple de code

Voici le code optimisé pour diffuser un fichier JSON en utilisant JsonReader :

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

Ce code lit le fichier efficacement, désérialisant les objets au fur et à mesure qu'ils sont rencontrés dans le flux, sans prendre trop de RAM. Notez que myobject doit être remplacé par votre type d'objet réel MyObject. La gestion des o objets a été ajoutée au code afin que chaque objet puisse être manipulé après désérialisation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn