2013-10-22 141 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