Xpleria
Xpleria

Reputation: 5873

Deserialize multiple json objects from a stream using Newtonsoft Json

I am reading a NetworkStream for json string and then deserializing it using Newtonsoft.Json.

Sometimes, two json objects could be sent back-to-back and read at the same time on the stream. But the Newtonsoft.Json serializer gives me only one object.

For example, if I have the following string on the stream:

{"name":"John Doe","age":10}{"name":"Jane Doe","age":10}

If I deserialize the stream, the serializer reads the entire stream, but gives only the first object.

Is there a way to make the serializer read only the first object from the stream and then read the next object in the next iteration of a loop?

Code:

public static Person Deserialize(Stream stream)
{
    var Serializer = new JsonSerializer();
    var streamReader = new StreamReader(stream, new UTF8Encoding());
    return Serializer.Deserialize<Person>(new JsonTextReader(streamReader));
}

I cannot deserialize as a list because I'm not receiving a json array.

Upvotes: 13

Views: 6951

Answers (2)

Ghulam Mohayudin
Ghulam Mohayudin

Reputation: 1113

you can try it doing like this

        var httpRequest = HttpContext.Current.Request;
        // This list will have all the stream objects
        var persons = new List<Person>();
        if (httpRequest.Files.Count > 0)
        {
            for (var obj = 0; doc < httpRequest.Files.Count; obj++)
            {
                var postedFile = httpRequest.Files[obj];
                var bytes = new byte[postedFile.ContentLength];
                postedFile.InputStream.Read(bytes, 0, postedFile.ContentLength);
                persons.Add(Serializer.Deserialize<Person>(new JsonTextReader(new StreamReader(new MemoryStream(bytes)))));
            }
        }

Upvotes: 0

Evk
Evk

Reputation: 101633

I think you can do it like this:

public static IList<Person> Deserialize(Stream stream) {
    var serializer = new JsonSerializer();
    var streamReader = new StreamReader(stream, new UTF8Encoding());
    var result = new List<Person>();
    using (var reader = new JsonTextReader(streamReader)) {
        reader.CloseInput = false;
        // important part
        reader.SupportMultipleContent = true;
        while (reader.Read()) {
            result.Add(serializer.Deserialize<Person>(reader));
        }
    }
    return result;
}

Important part is SupportMultipleContent property, which notifies reader that there might be multiple json objects side to side.

Upvotes: 14

Related Questions