首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Json.NET如何通过属性覆盖定义自定义JsonConverter的类型的序列化?

Json.NET如何通过属性覆盖定义自定义JsonConverter的类型的序列化?
EN

Stack Overflow用户
提问于 2013-06-28 23:36:19
回答 1查看 16.7K关注 0票数 17

我正在尝试使用Json.NET和自定义的JsonConverter对象来反序列化一个类。该类当前定义了一个转换器,用于使用JsonConverterAttribute进行默认序列化。我需要通过传入自定义转换器来执行自定义反序列化。但是,反序列化似乎仍然使用默认转换器。怎样才能让Json.NET更喜欢我的自定义转换器?

这里有一些示例代码演示了这个问题。我使用的是NewtonSoft.Json 4.5.11:

代码语言:javascript
代码运行次数:0
运行
复制
void Main()
{
    JsonConvert.DeserializeObject<Foo>("{}"); // throws "in the default converter"
    var settings = new JsonSerializerSettings { Converters = new[] { new CustomConverter() } };
    JsonConvert.DeserializeObject<Foo>("{}", settings); // still throws "in the default converter" :-/
}

[JsonConverter(typeof(DefaultConverter))]
public class Foo {
}

public class DefaultConverter : JsonConverter {
    public override bool CanConvert(Type objectType)
    {
        return typeof(Foo).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new Exception("in the default converter!");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new Exception("in the default converter!");
    }
}

public class CustomConverter : JsonConverter {
    public override bool CanConvert(Type objectType)
    {
        return typeof(Foo).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new Exception("in the custom converter!");
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new Exception("in the custom converter!");
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-29 01:17:27

您需要使用自定义合同解析器。仅当未为类型指定转换器时,默认协定解析器才使用设置中的转换器。

代码语言:javascript
代码运行次数:0
运行
复制
class CustomContractResolver : DefaultContractResolver
{
    protected override JsonConverter ResolveContractConverter (Type objectType)
    {
        if (typeof(Foo).IsAssignableFrom(objectType))
            return null; // pretend converter is not specified
        return base.ResolveContractConverter(objectType);
    }
}

用法:

代码语言:javascript
代码运行次数:0
运行
复制
JsonConvert.DeserializeObject<Foo>("{}", new JsonSerializerSettings {
    ContractResolver = new CustomContractResolver(),
    Converters = new[] { new CustomConverter() },
});
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17368484

复制
相关文章

相似问题

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