C#中如何将输入流传入Utf8JsonReader完成JSON反序列化?
方案说明
你的需求完全可以实现,首先明确两个核心前提:
Utf8JsonReader没有实现IDisposable接口,不需要用using关键字包裹声明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
相关产品推荐
相关产品推荐

