首页 >后端开发 >C++ >如何使用 JSON.NET 反序列化 JSON 对象流?

如何使用 JSON.NET 反序列化 JSON 对象流?

Barbara Streisand
Barbara Streisand原创
2025-01-09 21:23:46842浏览

How to Deserialize a Stream of JSON Objects with JSON.NET?

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn