我正在尝试序列化一些bson从mongodb返回到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.jsonserialization exception:"错误从'mongodb.bson.bsonobjectid'。
内部异常: 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试图访问所有属性,因此您会收到该错误。
您可以通过编写用于BsonValue
的自定义转换器并将其传递到Serializationsettings中的Newtonsoft来解决该问题。您的转换器将需要在VSONVALUE上调用getBsonType()
,然后是正确的AsBoolean
,AsInt
或其他任何以获取实际值。