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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:35:11