C#JsonConverter可以根据类转换属性

时间:2018-09-27 17:18:19

标签: c# json asp.net-web-api json.net 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。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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参数,您可以从中进行属性定义等。