首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用自定义契约解析器代替DEserialization属性时,会忽略DEserialization的自定义JsonConverter

当使用自定义契约解析器代替DEserialization属性时,会忽略DEserialization的自定义JsonConverter
EN

Stack Overflow用户
提问于 2014-07-25 00:53:00
回答 1查看 1.9K关注 0票数 5

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

然而,我非常喜欢使用自定义契约解析器,根据文档,它应该能够完全替换所有属性的使用。

下面是我如何设置合同解析器:

代码语言:javascript
复制
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;
}

所有的东西都可以用于序列化,但是在反序列化过程中,我在契约解析器中设置的转换器似乎完全被忽略了。从来不调用TestConverterTestConverter方法。

我错过了什么很明显的东西吗?我是否需要将转换器附加到其他地方的属性上?

我创建了一个可运行的小例子来演示这个问题。如果第57行中的[JsonConverter]属性被注释掉,程序将崩溃,因为Json.net试图将一个整数转换为一个对象,而不是使用TestConverter。这个例子的源代码可以在这里找到:http://pastebin.com/xgVS6hXY

提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-25 13:28:27

[JsonConverter(typeof(TestConverter))]类的Artist属性中移除Song属性。将合同解析器的设置更改为以下示例:

代码语言:javascript
复制
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;
    }
}

一切都应该很好。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24946362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档