Gson排除指定字段

/ 0评 / 2

前言

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

发表评论

您的电子邮箱地址不会被公开。