如何使用Json.NET读取含多值键的BSON?数组属性反序列化为null
BSON反序列化时数组/集合属性始终为null的解决方法
问题场景
- 开发跨端通信程序:服务端基于C++实现,客户端基于C#实现
- 客户端侧采用Json.NET类库及配套BSON处理模块完成数据序列化、反序列化逻辑
- 待解析的BSON数据包含列表类型字段,结构示例:
{ "price": "193", "cart": ["apple", "banana", "watermelon"] }
- 定义的反序列化目标类如下:
public class Order { public int price {get; set;} public string[] cart {get; set;} }
- 参考官方示例编写反序列化代码后,执行时
cart属性始终返回null;将string[]类型替换为List<string>类型后问题仍然存在,异常代码片段:
byte[] data; // 存储接收到的BSON字节数据 /* 对应数据结构: { "price": "193", "cart": ["apple", "banana", "watermelon"] } */ MemoryStream ms = new MemoryStream(data); using (BsonReader reader = new BsonReader(ms)) { JsonSerializer serializer = new JsonSerializer(); Order o = serializer.Deserialize<Order>(reader); } Console.WriteLine(o.cart); // 报错:cart值为null
问题根因
读取器选型错误。Json.NET自带的旧版BsonReader是早期为兼容旧版MongoDB扩展JSON格式实现的,不遵循标准BSON解析规则,无法正确识别数组类型字段,反序列化过程中会直接跳过数组内容,导致对应集合属性始终无法被赋值、返回null。
修复方案
将代码中实例化的BsonReader替换为BsonDataReader即可,修正后的核心代码:
MemoryStream ms = new MemoryStream(data); using (BsonDataReader reader = new BsonDataReader(ms)) { JsonSerializer serializer = new JsonSerializer(); Order o = serializer.Deserialize<Order>(reader); }
替换后所有数组、List<T>等集合类型字段都可被正常解析,不会再出现属性为null的问题。
内容的提问来源于stack exchange,提问作者eladGN
相关产品推荐
相关产品推荐

