2013-08-20 9 views
10

Klasa JsonProperty zwrócona przez DefaultContractResolver.CreateProperty ma dwie właściwości dotyczące konwertera, Converter i MemberConverter. Nie znajduję wystarczająco dużo wyjaśnień na ich temat, więc jaka jest różnica między nimi? Kiedy używać każdego? Jaką właściwość ustawić w rozstrzygającym zamówieniu? "Pobiera lub ustawia konwerter elementów" z official documentation nie jest pomocny.Różnica między właściwościami konwertera i obiektu MemberConverter Json.troperty Json.Troperty

+0

Mam do czynienia z problemem niejednoznaczności, gdy zaimplementowałem niestandardowy resolver umowy. Okazało się, że ustawienie 'Konwertera' nie wystarczy, aby Json.NET zadzwonił do konwertera ... – Athari

Odpowiedz

2

Wygląda na to, że NS.Json obsługuje konwertery overridable; prawdopodobnie jest tak, że każda pojedyncza właściwość nie musi określać JsonConvertera, ale może w razie potrzeby go zastąpić.

wskazówki można znaleźć w źródle:

Od DefaultContractResolver.cs linia 1254:

private void SetPropertySettingsFromAttributes(JsonProperty property, object attributeProvider, string name, Type declaringType, MemberSerialization memberSerialization, out bool allowNonPublicAccess) 
{ 
    ... 
    // resolve converter for property 
    // the class type might have a converter but the property converter takes presidence 
    property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider); 
    property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider); 

I od JsonSerializerInternalReader.cs, line 348:

private JsonConverter GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty) 
    { 
     JsonConverter converter = null; 
     if (memberConverter != null) 
     { 
      // member attribute converter 
      converter = memberConverter; 
     } 
     else if (containerProperty != null && containerProperty.ItemConverter != null) 
     { 
      converter = containerProperty.ItemConverter; 
     } 
     else if (containerContract != null && containerContract.ItemConverter != null) 
     { 
      converter = containerContract.ItemConverter; 
     } 
     else if (contract != null) 
     { 
      JsonConverter matchingConverter; 
      if (contract.Converter != null) 
       // class attribute converter 
       converter = contract.Converter; 
      else if ((matchingConverter = Serializer.GetMatchingConverter(contract.UnderlyingType)) != null) 
       // passed in converters 
       converter = matchingConverter; 
      else if (contract.InternalConverter != null) 
       // internally specified converter 
       converter = contract.InternalConverter; 
     } 
     return converter; 
    } 
2

Mam otwarty problem o docs na to tutaj github.com/JamesNK/Newtonsoft.Json/issues/363.

Ale jedną oczywistą różnicą między nimi (oczywiste z kodu źródłowego) jest to, że Konwerter jest używany tylko podczas serializacji i MemberConverter tylko przy deserializacji. Nie wiem, czy to cała historia, a nazywanie wiele mówi.

Powiązane problemy