【问题标题】:The difference between Converter and MemberConverter properties of Json.NET's JsonPropertyJson.NET的JsonProperty的Converter和MemberConverter属性的区别
【发布时间】:2013-08-20 08:09:38
【问题描述】:

DefaultContractResolver.CreateProperty 返回的JsonProperty 类有两个关于转换器的属性,ConverterMemberConverter。我没有找到关于它们的足够解释,那么它们之间有什么区别?什么时候使用每一个?在合约解析器中设置什么属性? official documentation 中的“获取或设置成员转换器”没有帮助。

【问题讨论】:

  • 我在实现自定义合同解析器时遇到了模棱两可的问题。原来设置Converter还不足以让Json.NET调用转换器……

标签: .net json json.net


【解决方案1】:

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

【讨论】:

  • 这个答案没有回答问题:它们之间有什么区别
【解决方案2】:

我已经在这里github.com/JamesNK/Newtonsoft.Json/issues/363 提出了一个关于文档的问题。

但是它们之间的一个明显区别(从源代码中很明显,即)是 Converter 仅在序列化时使用,而 MemberConverter 仅在反序列化时使用。我不知道这是否是完整的故事,而且命名并没有说明太多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2021-06-08
    • 2016-02-18
    • 2019-08-12
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多