Gson 属性排除

Gson 属性排除

JSON即JavaScript对象表示法(JavaScript Object Notation),是存储和交换文本信息的语法,在当下被广为使用。在 java 开发中,对象转换成json的方式很多,主流开源包有JacksonGsonFastJson ,还有就是主流框架集成的json工具,集成工具中使用Jackson的较多。选择Gson的原因是因其API的简洁,但问题也随之而来。

在POJO之间可能会有相互持有对方对象,直接转JSON会进入死循环;也肯能持有对方集合(onToMany),如果使用懒加载,转JSON过程中会报no session的错误。所以,进行属性排除是十分必须的。排除属性通常有注解和策略两种方式,下面缝隙一下gson的排除方式。

Gson [email protected]

@Expose注解有两个属性,并且均有默认值:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Expose {
  
  /**
   * 如果 [email protected] true}, 序列化为JSON时保留该属性
   * 如果 [email protected] false}, 序列化为JSON时排除该属性
   * 默认 [email protected] true}.
   * @since 1.4
   */
  public boolean serialize() default true;

  /**
   * 如果 [email protected] true}, 从JSON反序列化时保留该属性
   * 如果 [email protected] false}, 从JSON反序列化时排除该属性
   * 默认 [email protected] true}.
   * @since 1.4
   */
  public boolean deserialize() default true;
}

使用注解排除属性时,构造Gson对象需要使用GsonBuilder的方式:

Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation()
        .create();

这种方式的问题在于[email protected],这个和其工具的逻辑完全是相反的,如果类的属性较多并且类的数量也较多时,复制粘贴也很麻烦。

Gson 基于自定义策略排除属性

Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
  @Override
  public boolean shouldSkipClass(Class<?> clazz) {
    // 过滤掉类名包含Set的类,可以排除Set集合等
    return clazz.getName().contains("Set");
  }

  @Override
  public boolean shouldSkipField(FieldAttributes field) {
    // [email protected]
     NotToJson notToJson = field.getAnnotation(NotToJson.class); 
     if(notToJson != null){
       return true;
     }
    return false; 
  }
}).create();

[email protected]

/**
 * 用于Gson进行filed排除
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotToJson {}

现在,只需要在不需要的域上添加@NotToJson即可。

Gson中还有一些其他排除方式,可以参见文章:http://www.jianshu.com/p/0e40a52c0063