Gson之排除字段的常见方式

转载请注明出处http://blog.csdn.net/pngfi/article/details/62122007

1.使用@Expose注解

这种方式我们在上篇博文已经讲过了,不知道的同学可以看一下。

2.使用transient关键字

你可以给字段添加transient 修饰符,这时Gson会忽略isLOLPlayer字段的序列化和反序列化,并且只需要通过new Gson()的方式构建Gson实例即可。

public class Student {
    public String name;
    public int age;
    public transient boolean isLOLPlayer;
}
 Student student=new Student("shilang",15,false);
 Gson gson=new Gson();
 String stuJson=gson.toJson(student);

输出的Json如下:

{
    "name":"shilang",
    "age":15
}

但是这种方式不像@Expose那样可以单独地控制序列化与反序列化的开关,使用transient 修饰符就意味着既不会序列化也不会反序列化。

3.通过排除策略

即使用GsonBuilder的setExclusionStrategies来设置。
比如下面的Java类:

public class Student {
    public Grade grade;
    public String name;
    public int age;
    public  boolean isLOLPlayer;
}

如果你不想序列化类型为Grade相关的所有字段,你可以这样

 GsonBuilder builder=new GsonBuilder();
 builder.setExclusionStrategies(new ExclusionStrategy() {
     @Override
     public boolean shouldSkipField(FieldAttributes f) 
     {
         return false;
     }
     @Override
     public boolean shouldSkipClass(Class clazz) {
          return Grade.class==clazz;
      }
  });
 Gson gson = builder.create();
 Student student=new Student(Grade.A,"shilang",15,false);
 String stuJson=gson.toJson(student);

我们看到ExclusionStrategy有两个方法可以重写,返回true表示跳过该字段或类。第一个方法是针对具体的字段的,第二个方法是针对类的。
FieldAttributes 的可用信息如下:

Gson之排除字段的常见方式_第1张图片

比如我们可以排除所有名字中含有name的字段:

 @Override
 public boolean shouldSkipField(FieldAttributes f) 
 {
     return f.getName().contains("name");
 }

比如我也可以自己定义一种注解,判断如果字段的注解中含有该注解就跳过该字段或者类:

private static class FooAnnotationExclusionStrategy implements ExclusionStrategy {
  public boolean shouldSkipClass(Class clazz) {
   return clazz.getAnnotation(FooAnnotation.class) != null;
   }

   public boolean shouldSkipField(FieldAttributes f) {
     return f.getAnnotation(FooAnnotation.class) != null;
   }
  }

注:上面我们通过setExclusionStrategies()来设置排除策略会在序列化和反序列化时候都生效,如果你想单向生效,GsonBuilder有如下两个方法:

addDeserializationExclusionStrategy(ExclusionStrategy)
addSerializationExclusionStrategy(ExclusionStrategy)

另外需要注意的是setExclusionStrategies(ExclusionStrategy… strategies)的参数类型,你可以传多个排除策略

4.通过修饰符

GsonBuilder 提供了excludeFieldsWithModifiers(int… modifiers)来排除特定修饰符的字段,这里可以传入多个修饰符,任何字段只要含有其中一个修饰符就会被排除。
比如下面我们排除被protected修饰的字段:

Gson gson = new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.PROTECTED) 
        .create();

到这里我们就会明白其实使用tranisent关键字只是通过修饰符排除的一种特例,默认情况Gson排除含有static或者tranisent修饰的字段。需要注意的是当我们调用excludeFieldsWithModifiers()时候会覆盖默认的设置。

你可能感兴趣的:(Gson)