Json.NET的JsonProperty的Converter和MemberConverter属性之间的区别

sho*_*ren 10 .net json json.net

JsonProperty返回的类DefaultContractResolver.CreateProperty有两个关于转换器的属性,ConverterMemberConverter.我没有找到关于它们的足够解释,那么它们之间的区别是什么?什么时候使用?在合同解析器中设置什么属性?官方文档中的 "获取或设置成员转换器" 没有帮助.

ant*_*duh 3

NS.Json 似乎支持可重写的转换器;据推测,这样每个单独的属性就不必指定 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);
Run Code Online (Sandbox Code Playgroud)

来自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;
    }
Run Code Online (Sandbox Code Playgroud)