我正在使用Json.NET(6.0.3)进行序列化。我编写了一个自定义的JsonConverter TestConverter,它处理某些BaseClass的实例(通过将它们转换为整数id并返回)。当我用JsonConverter[typeof(TestConverter)]注释类中的属性时,一切工作正常。
但是,我非常喜欢使用自定义契约(Contract)解析器,根据documentation,它应该能够完全替换所有属性用法。
这是我设置契约(Contract)解析器的方法:

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;
}
对于序列化,一切工作都很好,但是在反序列化过程中,似乎完全忽略了我在契约(Contract)解析器中设置的转换器。永远不会调用ReadJsonTestConverter方法。
我是否真的缺少明显的东西?我是否需要将转换器附加到其他位置的属性?
我创建了一个小的可运行示例来演示该问题。如果第57行的[JsonConverter]属性被注释掉,则该程序将崩溃,因为Json.net尝试将整数转换为对象而不是使用TestConverter,因此异常。
示例的来源可以在这里找到:http://pastebin.com/xgVS6hXY
预先感谢您的任何帮助!

最佳答案

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

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

一切都应该正常工作。

关于c# - 使用自定义契约(Contract)解析器而不是JsonConverter属性时,将忽略自定义JsonConverter进行反序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24946362/

10-12 20:16