Класс JsonProperty
, возвращаемый DefaultContractResolver.CreateProperty
, имеет два свойства относительно преобразователя, Converter
и MemberConverter
. Я не нахожу достаточного объяснения о них, так какая разница между ними? Когда использовать каждый? Какую собственность установить в разрешении? "Получить или установить конвертер элементов" из официальной документации не помогает.
Разница между свойствами конвертера и MemberConverter Json.NET JsonProperty
Ответ 1
Казалось бы, NS.Json поддерживает overridable converters; предположительно это так, что каждому отдельному свойству не нужно указывать JsonConverter, но при необходимости он может переопределить его.
Подсказки можно найти в источнике:
От DefaultContractResolver.cs, строка 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);
И из JsonSerializerInternalReader.cs, строка 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
Я открыл проблему с документами здесь github.com/JamesNK/Newtonsoft.Json/issues/363.
Но одно очевидное различие между ними (очевидно, из исходного кода) заключается в том, что Конвертер используется только при сериализации и MemberConverter только при десериализации. Я не знаю, если это полная история, хотя и именование действительно говорит много.