版权声明:本文为博主原创文章,遵循 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