使用 JSON.NET 反序列化 JSON 对象流
在许多情况下,JSON 数据作为单个对象的流出现,没有任何分离。当使用 JSON.NET 将此类数据反序列化为 IEnumerable
初始方法和错误
尝试使用以下内容反序列化流代码导致错误:
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.
解决方案:高级读取器处理
要解决此问题,需要在每次成功后手动推进 JSON 读取器反序列化。更正后的循环结构如下:
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); } } }
使用和注意事项
要使用此方法,请提供包含 JSON 对象的开放流。迭代生成的 IEnumerable
例如:
using (var stream = /* some stream */) { IEnumerable<MyClass> result = ReadJson<MyClass>(stream); foreach (var item in result) { Console.WriteLine(item.MyProperty); } }
此示例还包含 JSON.NET 网站上的演示链接和 DotNet Fiddle 上的功能示例。
以上是如何使用 JSON.NET 反序列化 JSON 对象流?的详细内容。更多信息请关注PHP中文网其他相关文章!