Jackson介绍篇之filter

1.默认怎样被序列化?

对象的属性被初次确定的过程称为自动检测:所有的成员方法和字段被查找。

   1.1.“Getter”方法:所有public,带返回值,符合“getXxx”(“isXxx”,如果返回boolean,被称为“isgetter”)

命名约定的成员方法被推测存在名字为“xxx”的属性(属性名按照bean命名约定推测,即开头大写字母转成小写)。

   1.2.field属性:所有public成员字段被推测要显示的属性,使用字段名字来序列化。

在相同的逻辑属性中同时存在getter和field的情况下。getter方法优先被使用(field被忽略)。

属性集被解析使用这个过程被认为是基本属性集。但自动检测过程本身可以进行不同的配置,并有多个注释和配置设置,

可以进一步改变属性的真实有效集序列化。

2.改变默认的自动检测:@JsonAutoDetect

如果默认的自动检测可见限制(field和成员方法必须public)不是你想要的,可以下面的方法很容易的改变。

   2.1.@JsonAutoDetect 注解定义在class上;属性”fieldvisibility”,“gettervisibility”和“isgettervisibility”定义

最小能见度需要包括属性(分别对应fields,getters ,is-getters).有许多可能性,例如,包含所有field属性并设为可见(@JsonAutoDetect(fieldVisibility=Visibility.ANY));或者取消getter方法的自动检测(@JsonAutoDetect(getterVisibility=Visibility.NONE)),也可以联合使用。注意这个注解(和其他Jachson注解一样)可以当作mix-in annotation 没有必要直接修改类型;可以添加到基类并应用所有子类。

   2.2.ObjectMapper.setVisibilityChecker()可以被使用自定义最小化可见检测。

改变自动检测变化最小能见度限制是一个容易的方式来增加一些属性(例如通过暴露所有的成员方法,类似XStream 和Gson默认的工作原理),或者静止任意一个和所有的自动检测(即使用明确的注释@JsonProperty 或者@JsonGetter )

例如,序列化所有fields(并且不使用getter方法),你可以如下操作:

@JsonAutoDetect(fieldVisibility=Visibility.ANY,getterVisibility=Visibility.NONE,isGetterVisibility=Visibility.NONE)
  public class FieldsOnlyBean {
    private String name; // will now be used instead of getName()
    public String getName() { throw new Error(); } // never used!
}

3.明确的忽视属性:@JsonIgnore, @JsonIgnoreProperties

首先设置可能存在的自动检测属性,再通过每个属性注解来进一步修改序列化。

  3.1.@JsonProperty (@JsonGetter, @JsonAnyGetter) 被用于暗示一个field和方法是属性的field和getter方法,即不是自动检测。

  3.2.@JsonIgnore 被用于强制禁止被包含,忽视自动检测(和其它的注解)

另外,类注解@JsonIgnoreProperties被用于例举属性的逻辑名并不被序列化;更简单的方式是通过mix-annotations而不是每个属性注解(尽管两者都可以通过mix-inannotations来使用)。

所以你可以:

  @JsonIgnoreProperties({ "internal" })
  public class Bean {
    public Settings getInternal() { ... } // ignored
    @JsonIgnore public Settinger getBogus(); // likewise ignored
    public String getName(); // but this would be serialized
  }

4.定义profiles用于动态过滤:JSON Views (@JsonView)

目前配置方法被静态的应用。意味着一个属性将总被包含(除了null-values特殊情况)或者排除。

JSON views 是一种定义更加动态的包含/排除策略的方式。定义包含属性的规则如下,通过关联的有属性逻辑view(用于标识符的类;允许继承使用view),使用@JsonView的注解;定义哪个view将被序列化。这通常是用来定义较小的“public”的属性,和更大的“private”或“confidential”的性质。见“用法的例子@jsonview wiki页面

5.忽略所有的属性通过定义类:@JsonIgnoreType

除了定义的规则在每个属性的基础上,有时是有意义防止任何自动检测给定的类型属性序列化。例如,许多框架中添加特定的访问类型会产生,它返回的对象是不可序列化的。

例如,当提到对象关系Mapper是总会添加"public Schema getSchema()"访问所有class的值,并且如果这些元数据不是序列化状态的一部分,我们通过添加@JonsIgnoreType注解来禁止包含。这也是最简单的使用mix-in annotations.

6.完全动态filtering:@JsonFilter

虽然JSON view允许某种动态过滤,过滤器仍然是静态定义.这意味着,它是唯一可能动态地选择从一组静态的views。JSON滤波器的一种实现方法完全动态过滤。这是做的方法是通过定义逻辑过滤器的属性和@Jsonfilter(“id”)的注解使用,但指定实际的滤波器(及其配置)使用objectwriter。通过filterproviders可完全定制的得到自己的过滤器,或基于简单的实现。查看详情JSON filter网页

7.过滤性能的最极端的方式:beanserializermodifier

如果自定义过滤器的能力是不够的,可配置性最终是修改配置和BeanSerializer实例配置能力。这使得它可以做各种各样的修改(更改订单中的属性被序列化;添加,删除或重命名特性;更换一个自定义序列化程序完全实例等):你可以完全重写或更换普通POJO序列化(“bean”)类型。

这是通过添加一个beanserializermodifier实现:最简单的办法是通过模块接口。使用beanserializermodifier细节更高级的主题;基本的想法是,beanserializermodifier实例定义了回调,Jackson beanserializerfactory在构造序列化时,调用序列化程序。http://wiki.fasterxml.com/JacksonFeatureModules

  


转载于:https://my.oschina.net/fankun2013/blog/338443

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值