簡體   English   中英

在MongoDB中保存POCO時忽略屬性,但在序列化為JSON時不忽略它

[英]Ignore a property when saving a POCO in MongoDB, but not ignoring it when serializing to JSON

我有以下模型,我存儲在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
}

Resume是一個BsonDocument ,我存儲了無法標准化為POCO的任意JSON(每次出現都大不相同)。

我不想存儲該人的名字和姓氏,因為該信息已存儲在SQL數據庫中,我不想擔心同步更改。 所以我用[BsonIgnore]裝飾了這些參數。 當我的應用程序代碼從MongoDB檢索Person ,它會在將其序列化為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);
}

但是,生成的JSON缺少FirstNameLastName節點,顯然是因為它們用[BsonIgnore]

有沒有辦法告訴MongoDB C#官方驅動程序忽略在MongoDB中保存參數但在序列化為JSON時不要忽略它?

當你使用驅動程序本身將對象序列化為json ,我認為這是不可能的。

但是你可以(並且可能應該)使用json.net序列化為json 這樣,你的BsonIgnore將有沒有影響json序列化和json屬性(如JsonIgnore )會對你的蒙戈的驅動程序沒有任何影響。

public class Person
{
    [JsonIgnore]
    publis string FullName {get; set;}
    [BsonIgnore]
    public string FirstName { get; set; }
    [BsonIgnore]
    public string LastName { get; set; }
}

在我看來,這也是一個更好的設計,因為bson用於數據庫,而json (大多數)用於網絡消費,因此可以使用不同的工具完成。

我決定采用I3arnon的建議並使用Json.NET。 問題是Json.NET不知道如何處理大多數Mongo類型,因此序列化Resume屬性是有問題的,因為它的類型為BsonDocument 這是我想出的:

Json.NET通常可以序列化Mongo查詢的結果,但是BsonDocument給它一個問題。 在我的例子中,Json.NET無法在沒有關於如何處理BsonDocument特殊指令的情況下序列化Person

首先,我創建了一個JsonConverter稱為BsonDocumentConverter:

public class BsonDocumentConverter : JsonConverter
{
    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, JsonSerializer serializer)
    {
        var settings = new JsonWriterSettings()
        {
            OutputMode = JsonOutputMode.Strict
        };

        writer.WriteRawValue(value.ToJson(settings));
    }

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException("Why would I want to deserialize?");
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(BsonDocument);
    }
}

此轉換器使用MongoDB C#驅動程序序列化任何BsonDocuments。

要使用轉換器:

var result = JsonConvert.SerializeObject(person, Formatting.None, 
                 new JsonSerializerSettings() { 
                     NullValueHandling = NullValueHandling.Ignore,
                     Converters = new List<JsonConverter>() { 
                         new BsonDocumentConverter() 
                         } 
                 });

return Json(result, JsonRequestBehavior.AllowGet);

對firstname和lastname屬性使用[NotMapped]屬性並刪除[BsonIgnore]屬性。 它會工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM