Maison >développement back-end >C++ >Comment désérialiser un flux d'objets JSON avec JSON.NET ?

Comment désérialiser un flux d'objets JSON avec JSON.NET ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-09 21:23:46844parcourir

How to Deserialize a Stream of JSON Objects with 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 tandis que le flux reste ouvert.

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!

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