You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何将输入流传入Utf8JsonReader完成JSON反序列化?

方案说明

你的需求完全可以实现,首先明确两个核心前提:

  1. Utf8JsonReader 没有实现IDisposable接口,不需要用using关键字包裹声明
  2. Utf8JsonReader 不直接接收Stream类型的构造参数,你原有代码里的BinaryReader是面向二进制序列化场景的,JSON反序列化不需要用到这个类。

最简实现(推荐)

System.Text.Json 自带了针对Stream的反序列化重载,底层会自动处理Utf8JsonReader的初始化、读取逻辑,完全兼容自定义转换器:

using (Stream input = File.OpenRead(openDialog.FileName))
{
    var options = new JsonSerializerOptions
    {
        Converters = { new BaseClassConverter() },
    };
    MyObject = JsonSerializer.Deserialize<BaseClass>(input, options);
}

手动构造Utf8JsonReader的实现

如果你的业务场景需要手动控制Utf8JsonReader的逻辑(比如提前校验JSON结构、截取部分节点),可以按以下方式实现:

using (Stream input = File.OpenRead(openDialog.FileName))
using (var memoryStream = new MemoryStream())
{
    // 将文件流读取到内存缓冲区
    input.CopyTo(memoryStream);
    byte[] jsonBytes = memoryStream.ToArray();
    Utf8JsonReader reader = new Utf8JsonReader(jsonBytes);
    
    var options = new JsonSerializerOptions
    {
        Converters = { new BaseClassConverter() },
    };
    MyObject = JsonSerializer.Deserialize<BaseClass>(ref reader, options);
}

常见错误说明

你示例代码里写的reader.GetString()是错误用法:Utf8JsonReader的GetString()方法是读取当前指向的单个JSON节点的值为字符串,不是把整个JSON文件内容转为字符串,直接传入这个值会导致反序列化失败。


内容的提问来源于stack exchange,提问作者Connor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:54:04