如何将MongoDB BsonDocument集合序列化为以_id为键的键值对JSON
实现步骤
核心逻辑是先将数组结构转换为以_id为键、剩余字段为值的字典结构,再做序列化即可,两种常用实现方式如下:
方式1:仅用MongoDB官方驱动实现(无需额外依赖)
直接通过BsonDocument构造目标结构,再调用自带的ToJson()方法:
// 假设sourceDocs是你查询得到的BsonDocument数组/IEnumerable<BsonDocument> BsonDocument result = new BsonDocument(); foreach (BsonDocument doc in sourceDocs) { // 提取_id值作为顶级键,若_id为ObjectId类型可按需调用ToString()转为字符串格式 BsonValue id = doc["_id"]; // 克隆当前文档并删除_id字段 BsonDocument valueDoc = doc.DeepClone().AsBsonDocument; valueDoc.Remove("_id"); // 添加到结果文档 result.Add(id.ToString(), valueDoc); } // 直接序列化得到目标格式JSON // 可传入JsonWriterSettings自定义缩进、格式规则 string targetJson = result.ToJson(new JsonWriterSettings { Indent = true });
方式2:结合通用JSON序列化库实现(适配Newtonsoft.Json/System.Text.Json)
先转换为泛型字典结构,再用常用序列化库处理:
// 以Newtonsoft.Json为例 using Newtonsoft.Json; // 转换为Dictionary结构 Dictionary<string, object> resultDict = sourceDocs.ToDictionary( doc => doc["_id"].ToString(), doc => { BsonDocument tmp = doc.DeepClone().AsBsonDocument; tmp.Remove("_id"); // 将BsonDocument转为普通字典供序列化库识别 return tmp.ToDictionary(); } ); // 序列化输出 string targetJson = JsonConvert.SerializeObject(resultDict, Formatting.Indented);
注意事项
- 若
_id为MongoDB默认的ObjectId类型,未做转换直接序列化会得到{"$oid": "xxx"}的格式,提前调用ToString()可得到24位纯字符串ID - 需要保留BSON特殊类型(如ISODate、Decimal128)的序列化标识时,优先使用MongoDB驱动自带的
ToJson()方法,类型兼容性更好 - 可通过
JsonWriterSettings(驱动自带)或序列化库的配置参数自定义空值处理、日期格式、缩进规则等
内容的提问来源于stack exchange,提问作者Jordi Espada
相关产品推荐
相关产品推荐

