2014-07-25 18 views
5

Używam Json.NET (6.0.3) do serializacji. Napisałem niestandardowy JsonConverter TestConverter, który obsługuje instancje niektórych BaseClass (konwertując je na liczbę całkowitą id iz powrotem). Wszystko działa poprawnie, gdy przypisuję właściwości w moich klasach pod numerem JsonConverter[typeof(TestConverter)].Niestandardowy JsonConverter jest ignorowany w przypadku deserializacji, gdy używany jest niestandardowy resolver umowy zamiast JsonConverter.

Wolałbym jednak użyć niestandardowego przelicznika umowy, który powinien, zgodnie z documentation, być w stanie w pełni zastąpić użycie wszystkich atrybutów.

Oto jak skonfigurować resolwer zamówienia:

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
{ 
    var property = base.CreateProperty(member, memberSerialization); 
    if (typeof(BaseClass).IsAssignableFrom(property.PropertyType)) 
    { 
     property.Converter = new TestConverter(); 
    } 
    return property; 
} 

wszystko działa dobrze dla serializacji, jednak wydaje się, że przetwornica skonfigurować w rezolwerem zamówienia są całkowicie ignorowane podczas deserializacji. Metoda ReadJson z dnia TestConverter nigdy nie jest wywoływana.

Czy brakuje mi czegoś naprawdę oczywistego? Czy muszę dołączyć konwerter do nieruchomości w innym miejscu?

Stworzyłem mały przykład, który demonstruje problem. Jeśli zostanie zakomentowany atrybut [JsonConverter] w linii 57, program ulegnie awarii z wyjątkiem, ponieważ Json.net próbuje przekonwertować liczbę całkowitą na obiekt, zamiast korzystać z TestConverter. Źródło dla przykładu można znaleźć tutaj: http://pastebin.com/xgVS6hXY

Z góry dziękujemy za pomoc!

Odpowiedz

4

Usuń atrybut [JsonConverter(typeof(TestConverter))] z klasy Artist klasy Song. Zmień konfigurację resolwera umowy na następującą próbkę:

public class TestContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     if (typeof(BaseClass).IsAssignableFrom(property.PropertyType)) 
     { 
      var converter = new TestConverter(); 
      property.Converter = converter; 
      property.MemberConverter = converter; 
     } 
     return property; 
    } 
} 

Wszystko powinno działać poprawnie.

+1

Dziękuję, to działa. Czy zdajesz sobie sprawę, jaka jest różnica między tymi dwoma elementami/dlaczego potrzebuję dwóch ustawień? Znalazłem [to] (http://stackoverflow.com/questions/18330008/the-difference-between-converter-and-memberconverter-properties-of-json-nets-js) Pytanie SO, ale to naprawdę nie pomaga . – Jonas

Powiązane problemy