C # JsonConverter может конвертировать свойства в зависимости от класса - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу написать JsonConverter, он может преобразовывать определенный тип свойства, но только в зависимости от класса, в котором они определены.

Я регистрирую JsonConverter глобально через Web API:

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 сериализует и десериализует свойства MyType только тогда, когда свойство определено в классе, не оформленном с помощью CustomAttribute IgnoreSomeConverter.В примере я хочу использовать конвертер для ClassB, но не для ClassA.Есть идеи, чтобы получить это?

1 Ответ

0 голосов
/ 27 сентября 2018

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, из которого вы можете атрибуты и т. Д.

...