前言
在很多时候,我们在序列化/反序列化 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()只对反序列化生效。