【问题标题】:Custom JsonConverter is ignored for DEserialization when using custom contract resolver instead of JsonConverter attribute使用自定义合同解析器而不是 JsonConverter 属性时,自定义 JsonConverter 被忽略以进行反序列化
【发布时间】:2014-07-25 00:53:00
【问题描述】:

我正在使用 Json.NET (6.0.3) 进行序列化。我编写了一个自定义 JsonConverter TestConverter 来处理一些 BaseClass 的实例(通过将它们转换为整数 id 并返回)。当我使用 JsonConverter[typeof(TestConverter)] 注释类中的属性时,一切正常。

然而,我更喜欢使用自定义合同解析器,根据documentation,它应该能够完全替换所有属性使用。

以下是我设置合同解析器的方法:

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
    var property = base.CreateProperty(member, memberSerialization);
    if (typeof(BaseClass).IsAssignableFrom(property.PropertyType))
    {
        property.Converter = new TestConverter();
    }
    return property;
}

序列化一切正常,但是我在合约解析器中设置的转换器似乎在反序列化过程中完全忽略TestConverterReadJson 方法永远不会被调用。

我是否遗漏了一些非常明显的东西?我需要将转换器附加到其他地方的财产吗?

我创建了一个可运行的小示例来演示该问题。如果第 57 行中的 [JsonConverter] 属性被注释掉,程序将崩溃并出现异常,因为 Json.net 正在尝试将整数转换为对象,而不是使用 TestConverter。 示例的来源可以在这里找到:http://pastebin.com/xgVS6hXY

提前感谢您的帮助!

【问题讨论】:

    标签: c# .net serialization json.net


    【解决方案1】:

    Song 类的 Artist 属性中删除 [JsonConverter(typeof(TestConverter))] 属性。将合约解析器的设置更改为以下示例:

    public class TestContractResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);
            if (typeof(BaseClass).IsAssignableFrom(property.PropertyType))
            {
                var converter = new TestConverter();
                property.Converter = converter;
                property.MemberConverter  = converter;
            }
            return property;
        }
    }
    

    一切正常。

    【讨论】:

    • 谢谢,它有效。您是否碰巧知道两者之间的区别是什么/为什么我需要两个设置?我发现了this SO 问题,但它并没有真正的帮助。
    猜你喜欢
    • 2014-10-09
    • 2016-12-23
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多