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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:06:26