NewtonSoft.JSON官方手册中文版【连载14】

有条件的属性序列化

Json.NET具有有条件地序列化属性的能力,只要在类上放置ShouldSerialize方法。此功能类似于XmlSerializer 的ShouldSerialize功能

ShouldSerialize

若要有条件地序列化一个属性,添加一个方法,带有和属性相同的名称,并返回布尔值,然后方法名称加前缀ShouldSerialize。此方法的结果确定了属性是否要序列化。如果此方法返回true,则属性将会被序列化,如果它返回false,则属性会被跳过。

带有ShouldSerialize方法的Employee类

public class Employee
{
  public string Name { get; set; }
  public Employee Manager { get; set; }
  public bool ShouldSerializeManager()
  {
      // don't serialize the Manager property if an employee is their own manager
      return (Manager != this);
  }
}

ShouldSerialize 输出

Employee joe = new Employee();
joe.Name = "Joe Employee";
Employee mike = new Employee();
mike.Name = "Mike Manager";
joe.Manager = mike;
// mike is his own manager
// ShouldSerialize will skip this property
mike.Manager = mike;
string json = JsonConvert.SerializeObject(new[] { joe, mike }, Formatting.Indented);
// [
//   {
//     "Name": "Joe Employee",
//     "Manager": {
//       "Name": "Mike Manager"
//     }
//   },
//   {
//     "Name": "Mike Manager"
//   }
// ]

IContractResolver

还可以利用IContractResolver来设置ShouldSerialize。如果你不想要把一个ShouldSerialize方法放到类上,如果你不想声明类,如果你不能声明类,利用IContractResolver实现条件化地序列化一个属性是很有用的。

带有IContractResolver的条件属性

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 =>
              {
                  Employee e = (Employee)instance;
                  return e.Manager != e;
              };
      }
      return property;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值