2013-06-28 5 views
15

Ich versuche, eine Klasse mit Json.NET und einem benutzerdefinierten JsonConverter-Objekt zu deserialisieren. Die Klasse definiert derzeit einen Konverter für die Standardserialisierung mit dem JsonConverterAttribute. Ich muss eine benutzerdefinierte Deserialisierung durchführen, indem ich einen benutzerdefinierten Konverter übergebe. Die Deserialisierung scheint jedoch weiterhin den Standardkonverter zu verwenden. Wie kann ich Json.NET dazu bringen, meinen benutzerdefinierten Konverter zu bevorzugen?Json.NET Wie überschreibt Serialisierung für einen Typ, der einen benutzerdefinierten JsonConverter über ein Attribut definiert?

Hier ist ein Beispielcode, der das Problem veranschaulicht. Ich benutze 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!"); 
    } 
} 

Antwort

17

Sie müssen benutzerdefinierte Vertragsresolver verwenden. Der Standard-Contract Resolver verwendet Converter nur dann von den Einstellungen, wenn der Converter nicht für den Typ angegeben ist.

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

Verbrauch:

JsonConvert.DeserializeObject<Foo>("{}", new JsonSerializerSettings { 
    ContractResolver = new CustomContractResolver(), 
    Converters = new[] { new CustomConverter() }, 
}); 
Verwandte Themen