我正在尝试将从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
Newtonsoft尝试将对象的每个属性读取为Json值。因此,如果您的对象有public string Lol {get { throw new Exception}}
,Newtonsoft将尝试读取Lol
,获取异常,并且将无法序列化。
现在,Bson值有很多属性,如AsBoolean
,AsString
,如果实际值不是他们所期望的,则抛出异常。 Mongo希望您知道bson中包含的值,并访问相应的proeprty。但是,由于Newtonsoft尝试访问所有属性,您会收到该错误。
您可以通过为custom converter编写BsonValue
并将其传递给SerializationSettings中的Newtonsoft来解决该问题。您的转换器需要在VsonValue上调用getBsonType()
,然后调用正确的AsBoolean
,AsInt
或其他任何内容来获取实际值。