2011-06-10 303 views
36

我目前使用相同的C#DTO通過LoveSeat將數據從CouchDB中提取出來,我將通過ASP MVC控制器返回JSON。Newtonsoft忽略屬性?

我正在使用NewtonSoft庫在通過控制器發送它們之前對我的DTO進行分區。

然而,隨着CouchDB中也使用NewtonSoft它也尊重財產水平NewtonSoft屬性,如

[JsonIgnore] 
[JsonProperty("foo")] 

反正是有告訴newtonsoft庫明確忽略這些屬性? LoveSeat允許我提供自己的IObjectSerializer impl,它使我可以完全控制netsonts的JsonSerializerSettings。那麼,通過這些設置我可以忽略這些屬性嗎?

我問,作爲目前唯一可以看到的替代方案是欺騙我的DTO。雖然不可怕,但並不好。

我能看到的唯一方法是將我自己的Newtonsoft.Json源代碼版本引入到我的項目中,使用不同的程序集名稱等。但這種方式的瘋狂絕對存在,我只會在DTO之前我走在這條路上。

回答

4

我最終創建了所需的所有屬性,只將屬性添加到虛擬中,並在另一個類中將它們單獨替換爲相關的newtonsoft屬性。

這允許我在從CouchDB進行反序列化並對GET進行序列化時不會有太多的欺騙,從而產生不同的序列化行爲。這很好,也是一種獎勵,兩者相輔相成;無論如何,我想要改變基地。

這將仍然很高興知道我的原始問題是否可能?

6

一個建議,你可能不喜歡。對於最佳做法,我建議有兩個幾乎相同的對象。一個專門用於映射到數據庫的數據訪問層(域對象)。還有一個獨立的DTO,您的應用程序關心。通過這種方式,域對象將主要包含比DTO更多的屬性,並且可以分離關注點。

+0

感謝您的回覆!在這種情況下,數據源是CouchDB,而不是非SQL化數據庫。因此它已經以JSON格式存儲,並且可以直接從沙發上反序列化。所以唯一的區別就是牛頓軟件的屬性。正如我在origianl post中所說,如果沒有其他辦法,我準備下臺DTO路線。 – Jammin 2011-06-10 19:14:58

2

This newtonking.com link有助於類似的情況。它擴展了DefaultContractResolver類。爲了使工作我不得不更換

protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract) 

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
38

我不知道這是否是你追求的,但是從我的理解,你要尋找的[JsonIgnore]屬性。將屬性從剩下的對象序列化爲JSON。

[JsonIgnore] 
public string Whatever{ get; set; } 
+2

忽略反序列化但仍然序列化的任何解決方案? Thankyou。 – 2017-07-23 20:11:38