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

