小编典典

通过自定义属性(json.net)从序列化中排除属性

c#

我需要能够控制如何/是否对类的某些属性进行序列化。最简单的情况是[ScriptIgnore]。但是,我只希望针对我正在处理的这一特定序列化情况来兑现这些属性-
如果应用程序中下游的其他模块也希望序列化这些对象,则这些属性都不会妨碍您。

因此,我的想法是在属性MyAttribute上使用自定义属性,并使用知道要查找该属性的钩子初始化JsonSerializer的特定实例。

乍一看,我看不到JSON.NET中的任何可用挂钩点都会为PropertyInfo当前属性提供进行此类检查的功能-
仅属性的值。我想念什么吗?还是解决这个问题的更好方法?


阅读 277

收藏
2020-05-19

共1个答案

小编典典

您有几种选择。我建议您在阅读以下内容之前,先阅读有关该主题的Json.Net文档文章

本文介绍了两种方法:

  1. 创建一个bool基于Json.Net将遵循的命名约定来返回值的方法,以确定是否序列化该属性。
  2. 创建一个忽略该属性的自定义合同解析器。

在这两者中,我赞成后者。完全跳过属性-
仅使用它们忽略所有形式的序列化中的属性。相反,创建一个忽略有问题的属性的自定义合同解析器,并且仅在您要忽略该属性时才使用合同解析器,而让该类的其他用户可以随意序列化该属性,也可以不随意执行。

编辑 为了避免链接腐烂,我将从文章中发布相关代码

public class ShouldSerializeContractResolver : DefaultContractResolver
{
   public new static readonly ShouldSerializeContractResolver Instance =
                                 new ShouldSerializeContractResolver();

   protected override JsonProperty CreateProperty( MemberInfo member,
                                    MemberSerialization memberSerialization )
   {
      JsonProperty property = base.CreateProperty( member, memberSerialization );

      if( property.DeclaringType == typeof(Employee) &&
            property.PropertyName == "Manager" )
      {
         property.ShouldSerialize = instance =>
         {
            // replace this logic with your own, probably just  
            // return false;
            Employee e = (Employee)instance;
            return e.Manager != e;
         };
      }

      return property;
   }
}
2020-05-19