序列化到Bson的JSON



我正在尝试序列化一些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值具有许多属性,例如AsBooleanAsString,如果实际值不是他们期望的,则会引发异常。Mongo希望您知道BSON中包含什么价值并访问适当的Proeprty。但是由于Newtonsoft试图访问所有属性,因此您会收到该错误。

您可以通过编写用于BsonValue的自定义转换器并将其传递到Serializationsettings中的Newtonsoft来解决该问题。您的转换器将需要在VSONVALUE上调用getBsonType(),然后是正确的AsBooleanAsInt或其他任何以获取实际值。

相关内容

  • 没有找到相关文章

最新更新