2016-09-21 61 views
6

藍圖數據結構:添加多個合同解析器在Newtonsoft.Json

public class Movie 
{ 
    public string Name { get; set; } 
} 

使用Newtonsoft.Json,我有一個JSON序列如下配置。

var settings = new JsonSerializerSettings() { 
    ContractResolver = new CamelCasePropertyNamesContractResolver(), 
}; 

很明顯的是,這會打印出:

{ 
    name: null 
} 

現在,我需要另一個NullToEmptyStringResolver添加到ContractResolver在JsonSerializerSettings,我怎麼能做到這一點,其輸出如下:

{ 
    name: "" 
} 
  • 請注意,我的NullToEmptyStringResolver已經寫入。但是我需要將NullToEmptyStringResolver和CamelCasePropertyNamesContractResolver都添加到Contract Resolver中。
+2

請不要污損您的文章。 – Rizier123

回答

6

Json.Net一次不允許有多個合約解析器,因此您需要一種方法來組合它們的行爲。我假設NullToEmptyStringResolver是繼承自Json.Net的DefaultContractResolver類的自定義解析器。如果是這樣,實現所需結果的一種簡單方法是使NullToEmptyStringResolver改爲繼承CamelCasePropertyNamesContractResolver

public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver 
{ 
    ... 
} 

如果你不喜歡這種做法,另一種想法是駱駝外殼行爲添加到您的NullToEmptyStringResolver。如果你看看CamelCasePropertyNamesContractResolver是如何在source code實現,你會看到這是在構造函數中設置NamingStrategy(假設你使用Json.Net 9.0.1或更高版本)一樣簡單。您可以將相同的代碼添加到您的NullToEmptyStringResolver的構造函數中。

public class NullToEmptyStringResolver : DefaultContractResolver 
{ 
    public NullToEmptyStringResolver() : base() 
    { 
     NamingStrategy = new CamelCaseNamingStrategy 
     { 
      ProcessDictionaryKeys = true, 
      OverrideSpecifiedNames = true 
     }; 
    } 

    ... 
} 
+0

是的,它的工作,謝謝。 – shana0721shana

+0

是否可以將此解析器應用於模型屬性? http://stackoverflow.com/questions/43820249/keeping-contract-resolver-in-attribute – user960567