c# - Json.NET ¿cómo anular la serialización para un tipo que define un JsonConverter personalizado a través de un atributo?
(1)
Estoy intentando deserializar una clase usando Json.NET y un objeto JsonConverter personalizado. La clase actualmente define un convertidor para la serialización predeterminada utilizando el atributo JsonConverter. Necesito hacer una deserialización personalizada pasando un convertidor personalizado. Sin embargo, la deserialización todavía parece estar utilizando el convertidor predeterminado. ¿Cómo puedo hacer que Json.NET prefiera mi convertidor personalizado?
Aquí hay un poco de código de ejemplo que demuestra el problema. Estoy usando NewtonSoft.Json 4.5.11:
void Main()
{
JsonConvert.DeserializeObject<Foo>("{}"); // throws "in the default converter"
var settings = new JsonSerializerSettings { Converters = new[] { new CustomConverter() } };
JsonConvert.DeserializeObject<Foo>("{}", settings); // still throws "in the default converter" :-/
}
[JsonConverter(typeof(DefaultConverter))]
public class Foo {
}
public class DefaultConverter : JsonConverter {
public override bool CanConvert(Type objectType)
{
return typeof(Foo).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new Exception("in the default converter!");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new Exception("in the default converter!");
}
}
public class CustomConverter : JsonConverter {
public override bool CanConvert(Type objectType)
{
return typeof(Foo).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new Exception("in the custom converter!");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new Exception("in the custom converter!");
}
}
Es necesario utilizar resolución de contratos personalizada. La resolución de contratos predeterminada usa convertidores de la configuración solo si el convertidor no está especificado para el tipo.
class CustomContractResolver : DefaultContractResolver
{
protected override JsonConverter ResolveContractConverter (Type objectType)
{
if (typeof(Foo).IsAssignableFrom(objectType))
return null; // pretend converter is not specified
return base.ResolveContractConverter(objectType);
}
}
Uso:
JsonConvert.DeserializeObject<Foo>("{}", new JsonSerializerSettings {
ContractResolver = new CustomContractResolver(),
Converters = new[] { new CustomConverter() },
});