如何使用Utf8JsonReader从StreamReader读取数据?
从StreamReader读取数据适配Utf8JsonReader的最佳方法
Utf8JsonReader的构造函数支持从以下两种源读取JSON数据:
ReadOnlySpan<byte>类型的JSON字节数据ReadOnlySequence<byte>类型的JSON字节数据
由于StreamReader是面向字符流的处理工具,而Utf8JsonReader依赖UTF-8字节流解析,最优方案是跳过StreamReader,直接操作底层的字节流,避免字符与字节的额外转换开销。
推荐实现方式
1. 直接通过Stream读取字节缓冲区
适合中小体积的JSON数据:
using var stream = 获取你的Stream实例; // 替换为实际的Stream对象 var buffer = new byte[4096]; // 可根据实际情况调整缓冲区大小 int bytesRead; while ((bytesRead = await stream.ReadAsync(buffer)) > 0) { var reader = new Utf8JsonReader(buffer.AsSpan(0, bytesRead)); // 逐令牌解析JSON while (reader.Read()) { // 处理解析逻辑,例如判断令牌类型、读取值等 } }
2. 使用PipeReader处理大体积JSON
适合大文件或流式场景,内存效率更高:
using var stream = 获取你的Stream实例; var pipeReader = PipeReader.Create(stream); while (true) { var readResult = await pipeReader.ReadAsync(); var jsonBuffer = readResult.Buffer; var reader = new Utf8JsonReader(jsonBuffer); while (reader.Read()) { // 处理解析逻辑 } pipeReader.AdvanceTo(jsonBuffer.Start, jsonBuffer.End); if (readResult.IsCompleted) break; }
若必须基于StreamReader的场景(不推荐)
如果已通过StreamReader读取到字符串,可将其转换为UTF-8字节数组后传入Utf8JsonReader,但这种方式会产生额外的内存分配,性能低于直接操作字节流:
using var streamReader = new StreamReader(stream); string jsonContent = await streamReader.ReadToEndAsync(); byte[] utf8Bytes = Encoding.UTF8.GetBytes(jsonContent); var reader = new Utf8JsonReader(utf8Bytes.AsSpan()); // 处理解析逻辑
内容的提问来源于stack exchange,提问作者Daniel Peñalba
相关产品推荐
相关产品推荐

