gpt4 book ai didi

c# - 从 BSON 序列化为 JSON

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:55 26 4
gpt4 key购买 nike

我正在尝试将从 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: 'Error getting value from 'AsBoolean' on 'MongoDB.Bson.BsonObjectId'.'

Inner exception: InvalidCastException: Unable to cast object of type 'MongoDB.Bson.BsonObjectId' to type '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 中包含什么值并访问适当的属性。但是由于 Newtonsoft 尝试访问所有属性,因此您会收到该错误。

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

关于c# - 从 BSON 序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48016965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com