gpt4 book ai didi

c# - 当使用自定义契约(Contract)解析器而不是 JsonConverter 属性时,自定义 JsonConverter 被忽略以进行反序列化

转载 作者:太空狗 更新时间:2023-10-29 23:22:37 25 4
gpt4 key购买 nike

我正在使用 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)解析器中设置的转换器在反序列化过程中被完全忽略。永远不会调用 TestConverterReadJson 方法。

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

我创建了一个可运行的小示例来演示该问题。如果第 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com