如何在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
相关产品推荐
相关产品推荐

