解析mongosh返回内容调用BsonSerializer.Deserialize遇Long类型报错如何解决
Mongosh输出内容解析报错解决方案
问题原因
新版mongosh默认输出为Shell模式扩展JSON,会使用Long()、ObjectId()、ISODate()这类构造函数语法表示特殊类型,不属于标准BSON扩展JSON格式,因此C#的BsonSerializer无法直接识别解析。旧版mongo shell默认输出严格模式扩展JSON,所以可以直接解析。
解决方案
方案1(优先推荐):修改mongosh输出格式
在执行查询前,先在mongosh中执行以下命令设置输出为严格模式扩展JSON:
EJSON.setOutputFormat("strict")
设置后再执行查询,输出内容会自动转换为BsonSerializer可识别的格式:
ObjectId("xxx")变为{"$oid": "xxx"}ISODate("xxx")变为{"$date": "xxx"}Long("xxx")变为{"$numberLong": "xxx"}
处理后的输出可以直接用BsonSerializer.Deserialize<BsonArray>(string)解析,无需额外处理,也完全兼容动态结构的场景。
方案2:预处理现有输出文本
如果无法修改mongosh的输出配置,可通过正则替换将Shell模式语法转换为严格模式,C#示例代码如下:
using System.Text.RegularExpressions; // 原始mongosh输出文本 string rawOutput = "你的原始输出内容"; // 替换Long类型 var processedStr = Regex.Replace(rawOutput, @"Long\(""(\d+)""\)", @"{""$numberLong"":""$1""}"); // 替换ObjectId类型 processedStr = Regex.Replace(processedStr, @"ObjectId\(""([0-9a-fA-F]{24})""\)", @"{""$oid"":""$1""}"); // 替换ISODate类型 processedStr = Regex.Replace(processedStr, @"ISODate\(""([^""]+)""\)", @"{""$date"":""$1""}"); // 解析处理后的字符串 var result = BsonSerializer.Deserialize<BsonArray>(processedStr);
注意:该方案在文本内容本身包含类似构造函数字符串时可能出现误匹配,仅作为备选方案使用。
内容的提问来源于stack exchange,提问作者Витязи Team
相关产品推荐
相关产品推荐

