从BSON

时间:2017-12-29 03:12:37

标签: c# .net json json.net 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

1 个答案:

答案 0 :(得分:0)

Newtonsoft尝试将对象的每个属性读取为Json值。 因此,如果您的对象有Lol,Newtonsoft将尝试阅读AsBoolean,获取异常,并且序列化失败。

现在,Bson值有很多属性,如AsStringBsonValue,如果实际值不是他们期望的值,则抛出异常。 Mongo希望您知道bson中包含的值,并访问相应的proeprty。但是,由于Newtonsoft尝试访问所有属性,您会收到该错误。

您可以通过为AsBoolean编写flex并将其传递给SerializationSettings中的Newtonsoft来解决该问题。您的转换器需要在VsonValue上调用custom converter,然后调用正确的AsInt,{{1}}或其他任何内容来获取实际值。