有条件的属性序列化
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;
}
}