转载请注明出处http://blog.youkuaiyun.com/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 的可用信息如下:
比如我们可以排除所有名字中含有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()时候会覆盖默认的设置。