今天遇到一个需求,将一个类序列化时,需要动态决定哪些属性是否执行序列化。Json.NET作为一款强大的json序列化工具,提供ContractResolver以实现神乎奇技的高度动态化
下面这个范例,展示两种动态决定应序列化属性的情境:
JSerialize时传入属性名称数组作为参数,指定JSON应包含的属性。由对象属性值决定属性是否要序列化,例如: 如果是女生就不包含年龄。(这几乎已弹性到极点,虽然实务上不常用到)
程序的做法是提供两个继承自DefaultContractResolver的类:
-
LimitPropsContractResolver在建构时传入string[]参数列出要序列化的属性名称,并覆写CreateProperties方法,过滤base.CreateProperties()传回的IList,只保留前述string[]有列出的属性;
-
HideAgeContractResolver则覆写CreateProperty()方法,由base.CreateProperty()取得JsonProperty,JsonProperty有个ShouldSerialize属性可以传入Lambda表达式,遍历处理每个要序列化的对象,在Lambda表达式中可将对象转型为原型别进行判断,若不要序列化就返回false
下面是代码演示:
程序执行结果如下,共有三段输出,第一段为正常版;第二段套用LimitPropsContractResolver(“Name,Age”.Split(‘,’)),故JSON中只见Name及Age,Gender被隐藏;第三段套用了HideAgeContractResolver(),如结果所示,Mary的JSON内容不包含年龄,George则包含。