2017-07-24 80 views
-4

我應該考慮合同解析器,如果我使用自定義JSON轉換器?序列化使用ContractResolver和JsonConverter(JSON.NET)

我經歷了一個問題,當合同解析器永遠不會被調用,由於自己的JSON轉換器...

如果我應該做的..又是什麼做的常見方式?我無法找到有關的任何信息......

+0

沒有一個[MCVE]我們不能真正幫助你。只是猜測,如果你的問題是名稱與名稱映射一個'JsonConverter'衝突的'ContractResolver'是硬編碼,你可以1)通過'serializer.ContractResolver.ResolveContract(的objectType).Properties'和返回的屬性環路檢查任一['JsonProperty.UnderlyingName'](http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_Serialization_JsonProperty_UnderlyingName.htm)或['PropertyName'](http://www.newtonsoft.com/json/help /html/P_Newtonsoft_Json_Serialization_JsonProperty_PropertyName.htm)酌情或 – dbc

+0

.. 2)使用['JsonSerializer.Populate()'](http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonSerializer_Populate.htm)來填充構件爲此您需要默認的反序列化,如圖所示在[這個答案](https://stackoverflow.com/a/41512702/3744182)。 – dbc

+0

這是個好主意:「serializer.ContractResolver.ResolveContract(objectType).Prop erties」。但它不工作在我的具體情況...我正在閱讀JSON動態,所以objectType是System.Object它沒有屬性。我想ResolveContract是James如何計劃它被使用的方式..但是如果你想在數據轉換器中擁有非常自定義的邏輯,它看起來是不可能的。我會進一步調查。 – Maxim

回答

0

From documentation

傳遞一個JsonConverter到SerializeObject或DeserializeObject 提供了一種簡單的方法來徹底改變物體是如何 序列化。然而,有少量的開銷;每個值都會調用 CanConvert方法來檢查是否應該由該JsonConverter處理 序列化。有幾種方法可以繼續使用JsonConverters,而無需任何開銷。 最簡單的方法是使用 JsonConverterAttribute指定JsonConverter。該屬性告訴序列化程序在序列化和反序列化類型時始終使用該轉換器, 沒有檢查。

如果你要轉換的類不是你自己的,你是無法 使用屬性,JsonConverter仍然可以通過創建您自己的 使用IContractResolver。

+0

我問定製JsonConverter如何與現有的(或自定義)ContractResolver交互。我不是關於屬性的。我也可以在全局指定JsonConverter。換句話說,如果我們同時擁有(轉換器和解析器)應該如何實現? – Maxim

+0

比方說,你有某種類型的可表示爲字典。你使用自己的json轉換器來做到這一點。但除此之外,您還有合約解析器,例如應該更改屬性名稱的情況。這個合同解析器將永遠不會被應用。那麼如何在這樣的json轉換器中考慮解析器? – Maxim