我正在尝试将从MongoDB返回的一些BSON序列化为JSON:
var bson = MongoDB.Bson.BsonDocument.Parse(@"{
""_id"": ObjectId(""5a45a64ec7fe121dfc673c6f""),
""MyOtherId"": ObjectId(""5a45a64dc7fe121dfc673c6e""),
""Blah"": ""Test""
}");
我想将ObjectID变形成一个字符串,所以我得到了
"_id": "5a45a64ec7fe121dfc673c6f",
而不是
"_id": {"$oid": "5a4597a3d999f209e05df993"},
所以我尝试了这个:
var result = Newtonsoft.Json.JsonConvert.SerializeObject(bson, new Newtonsoft.Json.Bson.Converters.BsonDataObjectIdConverter());
但是我收到了一个错误:
Newtonsoft.Json.JsonSerializationException:'在'MongoDB.Bson.BsonObjectId'上从'AsBoolean'获取值时出错。'
内部异常: InvalidCastException:无法将类型为“MongoDB.Bson.BsonObjectId”的对象强制转换为“MongoDB.Bson.BsonBoolean”。
我仍然遇到简化版本的错误:
var result = Newtonsoft.Json.JsonConvert.SerializeObject(bson);
使用Newtonsoft.Json v10.0.3和MongoDB.Driver v2.5.0
答案 0 :(得分:0)
Newtonsoft尝试将对象的每个属性读取为Json值。
因此,如果您的对象有Lol
,Newtonsoft将尝试阅读AsBoolean
,获取异常,并且序列化失败。
现在,Bson值有很多属性,如AsString
,BsonValue
,如果实际值不是他们期望的值,则抛出异常。 Mongo希望您知道bson中包含的值,并访问相应的proeprty。但是,由于Newtonsoft尝试访问所有属性,您会收到该错误。
您可以通过为AsBoolean
编写flex
并将其传递给SerializationSettings中的Newtonsoft来解决该问题。您的转换器需要在VsonValue上调用custom converter,然后调用正确的AsInt
,{{1}}或其他任何内容来获取实际值。