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

如何在C#中创建UTF8字节JSON流?单元测试反序列化报错

问题原因与解决方案

错误根源

你遇到的反序列化错误,核心原因是写入字节后,MemoryStream的当前读取位置停留在字节数组末尾。JsonSerializer.DeserializeAsync从当前位置开始读取数据,自然读不到任何JSON内容,因此抛出"输入不包含任何JSON令牌"的异常。

修复方案

有两种简洁的方式解决这个问题:

方案1:直接用字节数组初始化MemoryStream

这种方式下,流的初始读取位置默认是0,无需额外操作:

var dog = new Dog() { Name = "Merlina" };
byte[] jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(dog);
var stream = new MemoryStream(jsonUtf8Bytes); // 直接传入字节数组,Position自动为0

方案2:写入后重置流的读取位置

如果坚持先创建空流再写入,写完后必须将流的Position重置到起始处:

var dog = new Dog() { Name = "Merlina" };
byte[] jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(dog);

var stream = new MemoryStream();
stream.Write(jsonUtf8Bytes, 0, jsonUtf8Bytes.Length);
stream.Position = 0; // 关键:将读取指针移到流的开头

也可以用Seek方法实现同样效果:

stream.Seek(0, SeekOrigin.Begin);

验证示例

修改后的完整测试代码示例:

// 假设你的扩展方法名为DeserializeToDynamic
var dog = new Dog() { Name = "Merlina" };
byte[] jsonUtf8Bytes = JsonSerializer.SerializeToUtf8Bytes(dog);
var stream = new MemoryStream(jsonUtf8Bytes);

dynamic result = await stream.DeserializeToDynamic(typeof(Dog));
Assert.Equal("Merlina", result.Name);

内容的提问来源于stack exchange,提问作者Brian Armenta Quezada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:45:32