2013-10-22 90 views
26

使用Json.Net,我在我的對象中需要特別注意的屬性,以便對它們進行序列化/反序列化。作爲JsonConverter的後裔,我成功地完成了這一任務。這是這樣做的常見方式:在Json.Net中全局註冊一個自定義的JsonConverter

public class SomeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     ... 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     ... 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     ... 
    } 
} 

class SomeClass 
{ 
    [JsonProperty, JsonConverter(typeof(SomeConverter))] 
    public SomeType SomeProperty; 
} 

//Later on, in code somewhere 
SomeClass SomeObject = new SomeClass(); 
string json = JsonConvert.SerializeObject(SomeObject, new SomeConverter()); 

我這段代碼的問題是,我要介紹我的自定義轉換器在每一個序列化/反序列化。在我的項目中有很多我不能這樣做的情況。例如,我正在使用其他使用Json.Net的外部項目,他們將在我的SomeClass實例上工作。但由於我不想或不能在他們的代碼中進行更改,所以我無法介紹我的轉換器。

有沒有什麼辦法可以註冊我的轉換器,在Json.Net中使用一些static成員,所以無論序列化/反序列化發生在哪裏,我的轉換器總是存在?

回答

46

是的,這可以使用Json.Net 5.0.5或更高版本。請參閱JsonConvert.DefaultSettings

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    Converters = new List<JsonConverter> { new SomeConverter() } 
}; 

// Later on... 
string json = JsonConvert.SerializeObject(someObject); // this will use SomeConverter 

如果您使用的Web API,你可以設立一個轉換器全球這樣,而不是:

var config = GlobalConfiguration.Configuration; 
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; 
jsonSettings.Converters.Add(new SomeConverter()); 
+0

太感謝了,你讓我:)日 – Mehran

+0

如果我這樣做的App_Start()事件讓我在asp.net網頁API錯誤。說'方法沒有找到:'虛空Newtonsoft.Json.JsonConvert.set_DefaultSettings' –

+0

@DonnyV。您可能使用的是JSON.NET的舊版本 - 它仍會編譯,因爲已添加到web.config的版本重定向。 – BrainSlugs83

13

另一種方法(這在一個@布賴恩勝在優先提到以上)是實現自定義的合同解析器

JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver(); 

和實現是相當簡單的

public class CustomContractResolver : DefaultContractResolver 
{ 
    private static readonly JsonConverter _converter = new MyCustomConverter(); 
    private static Type _type = typeof (MyCustomType); 

    protected override JsonConverter ResolveContractConverter(Type objectType) 
    { 
     if (objectType == null || !_type.IsAssignableFrom(objectType)) // alternatively _type == objectType 
     { 
      return base.ResolveContractConverter(objectType); 
     } 

     return _converter; 
    } 
} 

這兩種方法都是有效的,這一次僅僅是一個更大的錘子

+0

嗯,'JsonFormatter'不存在了嗎? – GregaMohorko

+0

它在WebAPI 2.x中有什麼作用? Mvc核心?您有一個JsonInputFormatter和JsonOutputFormatter –

+0

.NET Framework 4.6.1。我唯一發現的是'JsonConvert.DefaultSettings',它的類型是'JsonSerializerSettings'並且有一個'ContractResolver'屬性,但是這種方法與@Brian中的方法沒有什麼不同。 – GregaMohorko