c# - Registrar un JsonConverter personalizado globalmente en Json.Net
(2)
Otro enfoque (que gana en prioridad sobre el que @Brian menciona anteriormente) es implementar un resolutor 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
Al usar Json.Net , tengo propiedades en mis objetos que necesitan un cuidado especial para serializarlos o deserializarlos. 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 introducir 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 utilizan Json.Net y estarán trabajando en mis instancias de SomeClass
. Pero como no quiero o no puedo hacer cambios en su código, no tengo forma de presentar mi convertidor.
¿Hay alguna forma de registrar mi convertidor, utilizando algún miembro static
en Json.Net, de modo que no importa dónde suceda 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<JsonConverter> { 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());