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

Mongo C# Driver反序列化含NumberDecimal的JSON报错,是否为Bug及解决方案?

Mongo C# Driver反序列化含NumberDecimal的JSON时抛出Invalid BsonType异常的问题

问题现象

当JSON中包含NumberDecimal类型的值时,使用Mongo C# Driver的BsonSerializer.Deserialize方法会执行失败,抛出BsonInternalException("Invalid BsonType.")异常。示例代码如下:

string json = "{  \"newInProducts\" : [{\"planedStockinQty\" : NumberDecimal(\"22\") }] }";
var obj = BsonSerializer.Deserialize<ExpandoObject>(json); // 抛出BsonInternalException

经排查,问题根源在于C#驱动的JsonReader类的SkipValue方法中缺少对Decimal128类型的处理分支,而Mongo Java驱动的对应方法已包含该分支逻辑。

问题解答

是否为C#驱动的Bug?

是的,这确实是Mongo C#驱动的一个Bug。官方Java驱动已经实现了NumberDecimal类型的跳过处理逻辑,而C#驱动的SkipValue方法遗漏了该分支,导致无法正确识别并处理这种类型的值,最终抛出异常。

可行的解决办法

  • 升级驱动版本:优先检查Mongo C# Driver的最新版本,确认官方是否已修复该问题。如果有修复,直接升级到对应版本即可解决。
  • 自定义JsonReader扩展处理:继承官方的JsonReader类,重写SkipValue方法,添加Decimal128类型的处理分支,确保遇到NumberDecimal时能正确跳过对应的值。
  • 预处理JSON字符串:在反序列化前,将JSON中的NumberDecimal("xxx")格式替换为普通数字(如"22")。注意:这种方法会丢失Decimal128的高精度特性,仅适用于不需要保留高精度小数的场景。
  • 使用强类型实体类:如果业务场景允许,定义对应的数据实体类,将planedStockinQty字段声明为Decimal128类型,尝试绕过SkipValue方法的问题(部分场景下驱动会直接映射该类型而非触发跳过逻辑)。

内容的提问来源于stack exchange,提问作者Charlie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:10:37