在MongoDB中保存POCO时忽略属性,但在序列化为JSON时不忽略它

Cha*_*evy 6 c# json mongodb bson mongodb-.net-driver

我有以下模型,我存储在MongoDB中:

public class Person
{
    public ObjectId Id { get; set; }
    public Int PersonId { get; set; }
    public BsonDocument Resume { get; set; } // arbitrary JSON

    [BsonIgnore]
    public string FirstName { get; set; }    // stored elsewhere, 
                                             // populated at runtime
    [BsonIgnore]
    public string LastName { get; set; }     // ditto
}
Run Code Online (Sandbox Code Playgroud)

ResumeBsonDocument我存储无法标准化为POCO的任意JSON 的地方(每次出现都大不相同).

我不想存储该人的名字和姓氏,因为该信息已存储在SQL数据库中,我不想担心同步更改.所以我用这些参数装饰了[BsonIgnore].当我的应用程序代码Person从MongoDB中检索它时,它会在将序列化为JSON之前填充FirstNameLastName参数,如下所示:

public ActionResult GetPerson(int id)
{
    var query = New QueryDocument("_id", ObjectId.Parse(id));
    // personCollection is Collection<Person>
    var person = personCollection.FindOne(query);

    var pc = personCache.GetPerson(person.PersonId);

    person.FirstName = pc.FirstName;
    person.LastName = pc.LastName;

    var settings = New JsonWriterSettings() { Outputmode = JsonOutputMode.Strict }
    return Json(person.ToJson(settings), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

得到的JSON,但是,缺少FirstNameLastName节点,显然是因为他们装饰着[BsonIgnore].

有没有办法告诉官方MongoDB C#驱动程序忽略在MongoDB中保存参数但在序列化为JSON时不要忽略它?

i3a*_*non 5

当你使用驱动程序本身将对象序列化时,我认为这是不可能的json.

但是,您可以(也可能应该)使用json.net序列化json.这样你的序列化BsonIgnore没有任何影响,属性(如)对你的mongo驱动程序没有任何影响.jsonjsonJsonIgnore

public class Person
{
    [JsonIgnore]
    publis string FullName {get; set;}
    [BsonIgnore]
    public string FirstName { get; set; }
    [BsonIgnore]
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这也将是一个更好的设计,因为bson它用于数据库,json(大多数)用于网络消费,因此可以使用不同的工具.

  • MongoDB C#驱动程序可以序列化为JSON.它添加了一个`.ToJson`扩展方法.至于使用Json.NET,这是一个好主意,但在序列化Mongo类型时它不会开箱即用.我能够弄清楚并发布了答案.我把你的标记作为答案. (2认同)