首页 > 解决方案 > C# JsonConverter 可以根据类转换属性

问题描述

我想编写一个 JsonConverter 它可以转换确定的属性类型,但仅取决于它们定义的类。

我正在通过 Web API 全局注册 JsonConverter:

var config = GlobalConfiguration.Configuration;
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.Converters.Add(new SomeConverter());

例如,转换器可以转换 MyType 类型的对象。

public override bool CanConvert(Type objectType)
{
    return typeof(MyType).IsAssignableFrom(objectType);
}

但现在我想控制是否应该使用转换器。

我是这样想的:

[IgnoreSomeConverter]
public class ClassA
{
    public MyType PropMyType {get;set;}
}

public class ClassB
{
    public MyType PropMyType {get;set;}
}

因此,我希望 SomeConverter 仅在未使用 CustomAttribute IgnoreSomeConverter 修饰的类中定义属性时才对属性 MyType 进行序列化和反序列化。在示例中,我想将转换器用于 ClassB,但不用于 ClassA。有什么想法吗?

标签: c#jsonasp.net-web-apijson.netjsonconverter

解决方案


Newtonsoft.JSON包包含DefaultContractResolver类,在您的序列化程序设置中注册它,从中创建派生类,您可以将其应用于类或类属性。

public class ShouldSerializeContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        property.ShouldSerialize = i => false;
        property.Ignored = true;

        return property;
    }
}

并注册它。

    var serializer = new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() };

函数具有 MemberInfo 参数,您可以从中进行属性等。


推荐阅读