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
10
A
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.
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