Registrar un JsonConverter personalizado globalmente en Json.Net

Usando Json.Net , tengo propiedades en mis objetos que necesitan un cuidado especial para serializarlas / deserializarlas. JsonConverter descendiente de JsonConverter , logré lograr esto con éxito. Esta es la forma común de hacer esto:

 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()); 

Mi problema con este código es que necesito presentar mi convertidor personalizado en cada serialización / deserialización. En mi proyecto hay muchos casos en los que no puedo hacer eso. Por ejemplo, estoy usando otros proyectos externos que también hacen uso de Json.Net y estarán trabajando en mis instancias SomeClass . Pero como no quiero o no puedo hacer cambios en su código, no tengo forma de presentar mi convertidor.

¿Hay alguna manera de registrar mi convertidor, usando algún miembro static tal vez, en Json.Net así que no importa dónde ocurra la serialización / deserialización, mi convertidor siempre está presente?

Sí, esto es posible usando Json.Net 5.0.5 o posterior. Ver JsonConvert.DefaultSettings .

 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List { new SomeConverter() } }; // Later on... string json = JsonConvert.SerializeObject(someObject); // this will use SomeConverter 

Si está utilizando la API web, puede configurar un convertidor global como este en su lugar:

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

Otro enfoque (que gana en prioridad sobre el que menciona anteriormente Bryan) es implementar un resuelve de contrato personalizado

 JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver(); 

Y la implementación es bastante sencilla

 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; } } 

Ambos métodos son válidos, este es solo un martillo más grande