2013-08-20 7 views
10

Il JsonProperty classe restituita dal DefaultContractResolver.CreateProperty ha due proprietà di circa convertitore, Converter e MemberConverter. Non trovo abbastanza spiegazioni su di loro, quindi qual è la differenza tra loro? Quando usarli? Quale proprietà impostare nel resolver del contratto? "Ottiene o imposta il convertitore membro" da official documentation non è utile.La differenza tra convertitore e MemberConverter proprietà di del Json.NET JsonProperty

+0

Ho affrontato il problema di ambiguità quando ho implementato contratto di risoluzione personalizzato. Si è scoperto che l'impostazione 'Convertitore' non è sufficiente per fare in modo che Json.NET chiami il convertitore ... – Athari

risposta

2

Sembrerebbe che NS.Json supporta convertitori Overridable; presumibilmente questo è così che ogni singola proprietà non deve specificare un JsonConverter, ma possono sovrascriverlo se necessario.

suggerimenti possono essere trovati nella fonte:

Da DefaultContractResolver.cs, linea 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); 

E da 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

Ho aperto un problema circa la documentazione su questo qui github.com/JamesNK/Newtonsoft.Json/issues/363.

Ma una differenza evidente tra loro (chiaramente dal codice sorgente, che è) è che catalitica è utilizzata soltanto quando serializzazione e solo quando MemberConverter deserializzazione. Non so se questa è la storia completa, e la denominazione dice molto.

Problemi correlati