前言
在很多时候,我们在序列化/反序列化 json对象的时候,需要排除部份字段,比如用户相关的json,对于密码等,我们就不应该序列化提供出去,这时候就有必要进行下处理了。
使用@Expose注解
我们可以先看看@Expose的定义,如果我们想某个字段不想被序列化,我们可以将serialize设置为false,对应的deserialize表示反序列化。
public @interface Expose {
public boolean serialize() default true;
public boolean deserialize() default true;}
所以我们可以定义如下实体类
public class User {
@Expose
public String name;
@Expose(serialize = false)
public String passWord;
@Expose
public String address;
}
然后使用GsonBuilder来创建Gson对象。
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
String toJson = gson.toJson(new User("name", "****", "中国"));
这样我们就得到的json字符串中就不会包含passWord字段了。同样的,如果将json字符串反序列化为对象时需要排除某些字段,我们将deserialize设置为false即可。
通过上面我们可以知道,使用@Expose注解排除字段我们需要在所有需要序列化的字段上面使用注解,不使用注解的字段同样不会被序列/反序列化。使用注解以后就可以使用serialize/deserialize控制。然后使用GsonBuilder来生成Gson对象并调用builder.excludeFieldsWithoutExposeAnnotation().
使用@Expose注解很明显可以看到,如果我们有很多字段,但是只有某些字段不需要序列化/反序列化(这种情况是大多数),使用@Expose是很复杂的。所以我介绍下面一种更加灵活的方式。
使用ExclusionStrategy接口
同样的,我们来看看ExclusionStrategy接口的定义,有两个方法,分别代表字段以及字段类型,我们可以通过这两个方法用来定义自己的规则,用来过滤掉指定的字段名或者指定类型的字段。返回true。则表示跳过此字段。
public interface ExclusionStrategy {
public boolean shouldSkipField(FieldAttributes f);
public boolean shouldSkipClass(Class<?> clazz);}
下面的ExclusionStrategy将会屏蔽掉address字段。
private ExclusionStrategy mExclusionStrategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getName().equals("address");
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
};
下面的ExclusionStrategy将会屏蔽掉String类型。
private ExclusionStrategy mExclusionStrategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return "java.lang.String".equals(clazz.getName());
}
};
然后类似于@Expose,我们也需要使用GsonBuilder来创建Gson对象。
GsonBuilder builder = new GsonBuilder();
builder.setExclusionStrategies(mExclusionStrategy);
//只对序列化生效
//builder.addSerializationExclusionStrategy(mExclusionStrategy);
//只对反序列化生效
//builder.addDeserializationExclusionStrategy(mExclusionStrategy);
Gson gson = builder.create();
setExclusionStrategies方法设置,会对序列化/反序列化都生效
addSerializationExclusionStrategy() 只对序列化生效
addDeserializationExclusionStrategy()只对反序列化生效。
使用transient修饰变量
transient,在序列化和反序列化的时候,可以进行关键字的屏蔽