加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:52:13 所属栏目:百科 来源:网络整理
导读:DefaultContractResolver.CreateProperty返回的JsonProperty类有两个转换器,Converter和MemberConverter的属性.我没有找到足够的解释,所以有什么区别呢?何时使用每一个?在合同解析器中设定什么属性?从 official documentation获取或设置成员转换器是没有
DefaultContractResolver.CreateProperty返回的JsonProperty类有两个转换器,Converter和MemberConverter的属性.我没有找到足够的解释,所以有什么区别呢?何时使用每一个?在合同解析器中设定什么属性?从 official documentation获取或设置成员转换器是没有帮助的.
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);

并从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;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读