[英]Serialize to JSON from BSON
我正在嘗試將從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
,如果實際值不是他們期望的值, AsString
拋出異常。 Mongo希望您知道bson中包含什么值並訪問適當的屬性。 但是由於Newtonsoft嘗試訪問所有屬性,因此您會收到該錯誤。
您可以通過為BsonValue
編寫自定義轉換器並將其傳遞給SerializationSettings中的Newtonsoft來解決此問題。 您的轉換器將需要在getBsonType()
上調用getBsonType()
,然后調用正確的AsBoolean
, AsInt
或任何其他方法來獲取實際值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.