使用JSON.NET解析JSON对象流的正确方法是什么
本文关键字:JSON 是什么 方法 NET 解析 对象 使用 | 更新日期: 2023-09-27 18:28:00
我有一个JSON对象流,看起来有点像:
{...}{...}{...}{...}...
所以基本上是一个没有任何分隔符的JSON对象的串联列表。使用JSON.NET将这些反序列化为IEnumerable<T>
的正确方法是什么?现在我尝试了类似的东西
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);
}
}
但失败了
Newtonsoft.Json.JsonSerializationException: Unexpected token while deserializing object: EndObject. Path '', line 1, position 55.
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)
显然,我需要在Deserialize
调用后移动读取器,但我该如何做到这一点?
我认为如果你稍微改变一下你的循环,一切都应该正常:
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);
}
}
}
请注意,当传递给此方法的Stream
处于打开状态时,必须对IEnumerable<TResult>
进行迭代:
using (var stream = /* some stream */)
{
IEnumerable<MyClass> result = ReadJson<MyClass>(stream);
foreach (var item in result)
{
Console.WriteLine(item.MyProperty);
}
}
示例:https://dotnetfiddle.net/Y2FLuK
JsonNet网站上的示例:使用JsonReader 读取多个片段