[英]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之前填充FirstName
和LastName
參數,如下所示:
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缺少FirstName
和LastName
節點,顯然是因為它們用[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.