使用Newtonsoft Json从流中反序列化多个json对象

时间:2018-02-20 10:09:16

标签: c# .net json json.net json-deserialization

我正在为NetworkStream字符串读取json,然后使用Newtonsoft.Json 反序列化

有时,可以在流上同时发送两个json个对象并同时读取。但是Newtonsoft.Json serializer只给了我一个对象。

例如,如果我在流上有以下字符串:

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

如果我反序列化流,serializer会读取整个流,但只提供第一个对象。

有没有办法让serializer只读取流中的第一个对象,然后在循环的下一次迭代中读取下一个对象?

代码:

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

我无法去序列化作为列表,因为我没有收到json数组。

2 个答案:

答案 0 :(得分:3)

我认为你可以这样做:

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

重要的部分是SupportMultipleContent属性,它通知读者可能有多个json对象并排。

答案 1 :(得分:0)

你可以尝试这样做

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