代码之家  ›  专栏  ›  技术社区  ›  Xpleria Dholu

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

  •  9
  • Xpleria Dholu  · 技术社区  · 6 年前

    我正在读一本 NetworkStream 对于 json 字符串,然后 反序列化 it使用 Newtonsoft.Json .

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

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

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

    如果我反序列化流 序列化程序 读取整个流,但只给出第一个对象。

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

    代码:

    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 回复  |  直到 6 年前
        1
  •  9
  •   Evk    6 年前

    我想你可以这样做:

    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对象。

        2
  •  0
  •   Ghulam Mohayudin    6 年前

    你可以这样做

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