使用 Newtonsoft Json 从流中反序列化多个 json 对象
Deserialize multiple json objects from a stream using Newtonsoft Json
我正在为 json
字符串读取 NetworkStream
,然后使用 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
数组。
我想你可以这样做:
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
属性,它通知 reader 可能有多个 json 对象并排。
你可以这样试试
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)))));
}
}
我正在为 json
字符串读取 NetworkStream
,然后使用 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
数组。
我想你可以这样做:
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
属性,它通知 reader 可能有多个 json 对象并排。
你可以这样试试
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)))));
}
}