从BSON序列化为JSON

问题描述 投票:2回答:1

我正在尝试将从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

c# .net json json.net bson
1个回答
0
投票

Newtonsoft尝试将对象的每个属性读取为Json值。因此,如果您的对象有public string Lol {get { throw new Exception}},Newtonsoft将尝试读取Lol,获取异常,并且将无法序列化。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.