Désérialisation streaming Json.NET : traitement efficace des gros fichiers JSON
Pour les fichiers JSON volumineux contenant de nombreux objets identiques, il est crucial d'éviter de charger l'intégralité du fichier en mémoire. Json.NET fournit un moyen de désérialiser le contenu JSON directement à partir du flux, réduisant ainsi considérablement la consommation de mémoire.
Tentatives initiales et limitations
Désérialiser l'objet directement dans la boucle traitera le fichier comme un objet unique, qui échouera en raison de la présence de la liste JSON racine. La désérialisation de JSON dans une liste C#, même s'il est possible de lire les éléments un par un, consomme toujours beaucoup de mémoire car la liste contient tous les objets désérialisés.
Désérialisation en streaming
Afin de lire séquentiellement les objets dans le flux, la position de départ de chaque objet doit être identifiée et désérialisée en conséquence. Ceci peut être réalisé en utilisant l'attribut reader.TokenType
dans une boucle :
<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 ne se désérialise que lorsque le lecteur rencontre le début de l'objet ({). Ignorer d'autres marqueurs garantit une analyse efficace des fichiers volumineux sans consommer de RAM inutile. Le commentaire // 处理对象 o
est ajouté au code pour rappeler aux lecteurs que l'objet MyObject
lu doit être réellement traité après la 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!