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

标签 c# .net serialization json.net

我正在使用 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/

相关文章:

c# - 将流编码为 UTF-8 而不是 ASCII 后无法读取流中的整数

c# - SQL 查询 : Select Column1, 行数 (criteria1),行数 (criteria2)

ruby-on-rails - Ruby on Rails 高级 JSON 序列化

c# - WCF在跳转前是否序列化了db中的数据,又在哪里反序列化?

c# - 找不到正确的方法来调用延迟的 LINQ 语句

java - 序列化和文件大小

c# - 如何避免在 RestSharp 中转义字符?

c# - 我如何根据一天中的时间或访问者的设备等规则更改 Orchard CMS 中站点的主页?

c# - 具有部分 View 的 ASP.NET MVC 1.0 嵌套模型

c# - 如何使用TLBIMP.EXE?