当使用自定义契约解析器而不是JsonConverter属性时,将忽略自定义JsonConverter进行反序列化

本文关键字:自定义 JsonConverter 属性 反序列化 契约 | 更新日期: 2023-09-27 18:14:47

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

然而,我非常倾向于使用自定义契约解析器,根据文档,它应该能够完全取代所有属性的使用。

下面是我设置契约解析器的方法:
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

提前感谢您的帮助!

当使用自定义契约解析器而不是JsonConverter属性时,将忽略自定义JsonConverter进行反序列化

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

一切都应该正常。