我正在使用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)解析器中设置的转换器。永远不会调用ReadJson
的TestConverter
方法。我是否真的缺少明显的东西?我是否需要将转换器附加到其他位置的属性?
我创建了一个小的可运行示例来演示该问题。如果第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/