使用自定义合约解析程序而不是JsonConverter属性时,自定义JsonConverter会被反序列化忽略

时间:2014-07-25 00:53:01

标签: c# .net serialization json.net

我正在使用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;
}

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

我错过了一些非常明显的东西吗?我是否需要将转换器附加到其他地方的属性?

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

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

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

一切都应该正常。