【问题标题】:C# JsonConverter can convert properties depending on the classC# JsonConverter 可以根据类转换属性
【发布时间】:2018-09-27 17:18:19
【问题描述】:

我想编写一个 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。有什么想法吗?

【问题讨论】:

  • 您可以通过将NoConverter 中的linked answer 应用于不应使用全局转换器的属性来做到这一点,即public class ClassA { [JsonConverter(typeof(NoConverter))] public MyType PropMyType {get;set;} }
  • 是否可以通过在关卡类中而不是在关卡属性中定义 NoConverter 来做到这一点?
  • 不是开箱即用的。这将需要一个自定义合同解析器。这是回答问题的必要条件吗?链接的答案似乎很简单,无论哪种方式,您都需要向您的类型添加特定于序列化的属性。但如果是要求,问题可以重新打开。
  • 是的,这是一个要求。我在 DefaultContractResolver 中定义:property.Converter = new NoConverter(); 如果该类具有属性 IgnoreSomeConverter。访问课程:Type myType = Type.GetType(member.ReflectedType.AssemblyQualifiedName);
  • 是的,这是正确的方法。你想让我重新打开这个问题,以便你自己回答吗?

标签: c# json asp.net-web-api json.net jsonconverter


【解决方案1】:

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

【讨论】:

  • 在问题中,OP 确实想要序列化 ​​ClassA.PropMyType,只是不使用全局转换器。这个答案可以防止ClassA.PropMyType 被序列化,这不是我们想要的。
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2019-10-03
  • 2014-10-29
相关资源
最近更新 更多