Maison >développement back-end >C++ >Comment désérialiser un flux d'objets JSON avec JSON.NET ?
Désérialiser un flux d'objets JSON à l'aide de JSON.NET
Dans de nombreux scénarios, les données JSON se présentent sous la forme d'un flux d'objets individuels sans aucune séparation . Cela présente un défi lors de l'utilisation de JSON.NET pour désérialiser ces données dans un IEnumerable
Approche initiale et erreur
Tentative de désérialisation du flux en utilisant ce qui suit Le code entraîne une erreur :
var serializer = new JsonSerializer(); serializer.CheckAdditionalContent = false; using (var reader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(reader)) { reader.SupportMultipleContent = true; reader.Read(); while (reader.TokenType != JsonToken.None) { yield return serializer.Deserialize<TResult>(reader); } }
L'erreur indique une fin inattendue de l'objet après désérialiser un objet :
Newtonsoft.Json.JsonSerializationException: Unexpected token while deserializing object: EndObject. Path '', line 1, position 55.
Solution : Gestion avancée du lecteur
Pour résoudre ce problème, il est nécessaire d'avancer manuellement le lecteur JSON après chaque désérialisation réussie. La structure de boucle corrigée est la suivante :
public IEnumerable<TResult> ReadJson<TResult>(Stream stream) { var serializer = new JsonSerializer(); using (var reader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(reader)) { jsonReader.SupportMultipleContent = true; while (jsonReader.Read()) { yield return serializer.Deserialize<TResult>(jsonReader); } } }
Utilisation et considérations
Pour utiliser cette méthode, fournissez un flux ouvert contenant les objets JSON. Il est crucial de parcourir le résultat IEnumerable
Par exemple :
using (var stream = /* some stream */) { IEnumerable<MyClass> result = ReadJson<MyClass>(stream); foreach (var item in result) { Console.WriteLine(item.MyProperty); } }
Cet exemple comprend également un lien vers une démonstration sur le site JSON.NET et un exemple fonctionnel sur DotNet Fiddle.
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!