Gson之排除字段的常见方式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pngfi/article/details/62122007
转载请注明出处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;
}
1
2
3
4
5
 Student student=new Student("shilang",15,false);
 Gson gson=new Gson();
 String stuJson=gson.toJson(student);
1
2
3
输出的Json如下:

{
    "name":"shilang",
    "age":15
}
1
2
3
4
但是这种方式不像@Expose那样可以单独地控制序列化与反序列化的开关,使用transient 修饰符就意味着既不会序列化也不会反序列化。

3.通过排除策略
即使用GsonBuilder的setExclusionStrategies来设置。 
比如下面的Java类:

public class Student {
    public Grade grade;
    public String name;
    public int age;
    public  boolean isLOLPlayer;
}
1
2
3
4
5
6
如果你不想序列化类型为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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我们看到ExclusionStrategy有两个方法可以重写,返回true表示跳过该字段或类。第一个方法是针对具体的字段的,第二个方法是针对类的。 
FieldAttributes 的可用信息如下:

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

 @Override
 public boolean shouldSkipField(FieldAttributes f) 
 {
     return f.getName().contains("name");
 }
1
2
3
4
5
比如我也可以自己定义一种注解,判断如果字段的注解中含有该注解就跳过该字段或者类:

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;
   }
  }
1
2
3
4
5
6
7
8
9
注:上面我们通过setExclusionStrategies()来设置排除策略会在序列化和反序列化时候都生效,如果你想单向生效,GsonBuilder有如下两个方法:

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

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

Gson gson = new GsonBuilder()
        .excludeFieldsWithModifiers(Modifier.PROTECTED) 
        .create();
1
2
3
到这里我们就会明白其实使用tranisent关键字只是通过修饰符排除的一种特例,默认情况Gson排除含有static或者tranisent修饰的字段。需要注意的是当我们调用excludeFieldsWithModifiers()时候会覆盖默认的设置。
————————————————
版权声明:本文为CSDN博主「pngfi」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pngfi/article/details/62122007

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值