Home >Backend Development >C++ >How to Deserialize a Stream of JSON Objects with JSON.NET?

How to Deserialize a Stream of JSON Objects with JSON.NET?

Barbara Streisand
Barbara StreisandOriginal
2025-01-09 21:23:46926browse

How to Deserialize a Stream of JSON Objects with JSON.NET?

Deserializing a Stream of JSON Objects using JSON.NET

In many scenarios, JSON data comes as a stream of individual objects without any separation. This presents a challenge when using JSON.NET to deserialize such data into an IEnumerable.

Initial Approach and Error

Attempting to deserialize the stream using the following code results in an error:

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);
    }
}

The error indicates an unexpected end of object after deserializing one object:

Newtonsoft.Json.JsonSerializationException: Unexpected token while deserializing object: EndObject. Path '', line 1, position 55.

Solution: Advanced Reader Handling

To resolve this issue, it is necessary to advance the JSON reader manually after each successful deserialization. The corrected loop structure is as follows:

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);
        }
    }
}

Usage and Considerations

To use this method, provide an open stream that contains the JSON objects. It is crucial to iterate over the resulting IEnumerable while the stream remains open.

For example:

using (var stream = /* some stream */)
{
    IEnumerable<MyClass> result = ReadJson<MyClass>(stream);

    foreach (var item in result)
    {
        Console.WriteLine(item.MyProperty);
    }
}

This example also includes a link to a demonstration on the JSON.NET website and a functional example on DotNet Fiddle.

The above is the detailed content of How to Deserialize a Stream of JSON Objects with JSON.NET?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn