我正在使用 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)解析器中设置的转换器在反序列化过程中被完全忽略。永远不会调用 TestConverter
的 ReadJson
方法。
我是否漏掉了一些非常明显的东西?我是否需要将转换器附加到其他地方的属性?
我创建了一个可运行的小示例来演示该问题。如果第 57 行的 [JsonConverter]
属性被注释掉,程序将异常崩溃,因为 Json.net 试图将整数转换为对象,而不是使用 TestConverter
。
该示例的源代码可在此处找到:http://pastebin.com/xgVS6hXY
提前感谢您的帮助!
最佳答案
从 Song
类的 Artist 属性中删除 [JsonConverter(typeof(TestConverter))]
属性。将契约(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/