Json.NET的Converter和MemberConverter属性之间的差异';s JsonProperty

Json.NET的Converter和MemberConverter属性之间的差异';s JsonProperty,.net,json,json.net,.net,Json,Json.net,DefaultContractResolver.CreateProperty返回的JsonProperty类有两个关于转换器的属性,converter和MemberConverter。我找不到关于它们的足够解释,那么它们之间有什么区别呢?什么时候使用?在合同解析程序中设置什么属性?来自的“获取或设置成员转换器”没有帮助。看来NS.Json支持可重写的转换器;假设这是为了使每个单独的属性不必指定JsonConverter,但如果需要,它们可以重写它 可以在源代码中找到提示: 从,第1254行: p

DefaultContractResolver.CreateProperty
返回的
JsonProperty
类有两个关于转换器的属性,
converter
MemberConverter
。我找不到关于它们的足够解释,那么它们之间有什么区别呢?什么时候使用?在合同解析程序中设置什么属性?来自的“获取或设置成员转换器”没有帮助。

看来NS.Json支持可重写的转换器;假设这是为了使每个单独的属性不必指定JsonConverter,但如果需要,它们可以重写它

可以在源代码中找到提示:

从,第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);
和来自:


我在这里打开了一个关于文档的问题


但它们之间的一个明显区别(即从源代码中可以明显看出)是转换器仅在序列化时使用,而MemberConverter仅在反序列化时使用。不过,我不知道这是否是全部内容,而且名称也没有太多说明。

我在实现自定义合同解析程序时遇到了歧义问题。原来设置
Converter
不足以让Json.NET调用转换器……这个答案并没有回答这个问题:它们之间有什么区别
    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;
    }