Json.NET traite de grands flux JSON dans un environnement à mémoire limitée
L'analyse de fichiers JSON contenant un grand nombre d'objets similaires est un défi dans un environnement à mémoire limitée. Considérez le scénario suivant :
Un énorme fichier JSON contient de nombreux objets JSON avec la même structure. Si chaque objet est un fichier distinct, vous pouvez désérialiser les objets un par un. Cependant, en raison de la nature imbriquée des données, la désérialisation directe d'un tableau JSON de ces objets lèvera une exception indiquant qu'un objet était attendu plutôt qu'une liste.
Essayer de désérialiser l'intégralité du fichier JSON dans une liste d'objets C# évite avec succès le problème de la lecture de l'intégralité du fichier JSON dans la RAM. Cependant, cela introduit un nouveau problème lié à la création d’un objet liste C# qui contient toujours toutes les données du fichier JSON en mémoire.
Pour surmonter ces limitations, une stratégie est nécessaire pour lire les objets un par un. Cette approche élimine le besoin de charger l'intégralité de la chaîne JSON ou toutes les données dans la RAM en tant qu'objet C#.
Solution
L'exemple de code suivant illustre cette approche :
<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 simule la méthode initiale de désérialisation de l'objet dans une boucle, mais il ne désérialise l'objet que lorsque le lecteur rencontre un caractère "{" dans le flux. Cette approche traite efficacement les flux JSON sans surutiliser la RAM en passant à l'objet suivant jusqu'à ce qu'un autre marqueur d'objet de départ soit trouvé. Notez que myobject
dans le code a été corrigé en MyObject
, et des commentaires sur le traitement de l'objet o
ont été ajoutés pour faciliter aux utilisateurs d'ajouter des opérations ultérieures en fonction de la situation réelle.
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!