Google Gson 字段过滤:自定义过滤规则

Google Gson 支持自定义规则过滤字段,使用 GsonBuilder 类的 addSerializationExclusionStrategy 方法处理序列化过程中的字段过滤,使用 addDeserializationExclusionStrategy 方法处理反序列化过程中的字段过滤。这两个方法都接收 com.google.gson.ExclusionStrategy 接口类型参数

示例

1 addSerializationExclusionStrategy

(1) 基于 @Expose 注解过滤

POJO 类

class GsonObject {
    public String field1 = "FIELD_1";
    @Expose(serialize = true, deserialize = false)
    public String field2 = "FIELD_2";
    @Expose(serialize = false, deserialize = true)
    public String field3 = "FIELD_3";
    public String field4 = "FIELD_4";

    @Override
    public String toString() {
        return "GsonObject [field1=" + field1 + ", field2=" + field2 + ", field3=" + field3 + ", field4=" + field4
                + "]";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

测试代码:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder()
        .addSerializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes arg0) {
                Expose expose = arg0.getAnnotation(Expose.class);
                if (expose != null && expose.deserialize() == false) {
                    return true;
                }
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return false;
            }
        }).create();
    System.out.println(gson.toJson(new GsonObject()));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行结果: 
这里写图片描述

(2) 基于字段名过滤

测试代码:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder()
        .addSerializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes arg0) {
                if (arg0.getName().equals("field4")) {
                    return true;
                }
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return false;
            }
        }).create();
    System.out.println(gson.toJson(new GsonObject()));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

运行结果: 
这里写图片描述

(3) 基于字段类型过滤

POJO 类

class GsonObject {
    public String field1 = "FIELD_1";
    public String field2 = "FIELD_2";
    public String field3 = "FIELD_3";
    public String field4 = "FIELD_4";
    public int field5 = 5;
    public double field6 = 6.0;
    public boolean field7 = false;

    @Override
    public String toString() {
        return "GsonObject [field1=" + field1 + ", field2=" + field2 + ", field3=" + field3 + ", field4=" + field4
            + ", field5=" + field5 + ", field6=" + field6 + ", field7=" + field7 + "]";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

测试代码:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder()
        .setVersion(1)
        .addSerializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes arg0) {
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return (arg0 == double.class || arg0 == Double.class);
            }
        }).create();
    System.out.println(gson.toJson(new GsonObject()));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果: 
这里写图片描述

2 addDeserializationExclusionStrategy

(1) 基于 @Expose 注解过滤

POJO 类

class GsonObject {
    private String field1;
    @Expose(serialize = true, deserialize = false)
    private String field2;
    @Expose(serialize = false, deserialize = true)
    private String field3;
    private String field4;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public String getField2() {
        return field2;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    public String getField3() {
        return field3;
    }

    public void setField3(String field3) {
        this.field3 = field3;
    }

    public String getField4() {
        return field4;
    }

    public void setField4(String field4) {
        this.field4 = field4;
    }

    @Override
    public String toString() {
        return "GsonObject [field1=" + field1 + ", field2=" + field2 + ", field3=" + field3 + ", field4=" + field4
                + "]";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

测试代码:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder()
        .addDeserializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes arg0) {
                Expose expose = arg0.getAnnotation(Expose.class);
                if (expose != null && expose.deserialize() == true) {
                    return true;
                }
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return false;
            }
        }).create();
    String gsonStr = "{\"field1\":\"FIELD_A\"," 
        + "\"field2\":\"FIELD_B\"," 
        + "\"field3\":\"FIELD_C\"," 
        + "\"field4\":\"FIELD_D\"}";
    System.out.println(gson.fromJson(gsonStr, GsonObject.class));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行结果: 
这里写图片描述

(2) 基于字段名过滤

测试代码:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder()
        .addDeserializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes arg0) {
                if (arg0.getName().equals("field4")) {
                    return true;
                }
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return false;
            }
        }).create();
    String gsonStr = "{\"field1\":\"FIELD_A\"," 
        + "\"field2\":\"FIELD_B\"," 
        + "\"field3\":\"FIELD_C\"," 
        + "\"field4\":\"FIELD_D\"}";
    System.out.println(gson.fromJson(gsonStr, GsonObject.class));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行结果: 
这里写图片描述

(3) 基于字段类型过滤

POJO 类

class GsonObject {
    private String field1;
    private String field2;
    private String field3;
    private String field4;
    private int field5;
    private double field6;
    private boolean field7;

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }

    public String getField2() {
        return field2;
    }

    public void setField2(String field2) {
        this.field2 = field2;
    }

    public String getField3() {
        return field3;
    }

    public void setField3(String field3) {
        this.field3 = field3;
    }

    public String getField4() {
        return field4;
    }

    public void setField4(String field4) {
        this.field4 = field4;
    }

    public int getField5() {
        return field5;
    }

    public void setField5(int field5) {
        this.field5 = field5;
    }

    public double getField6() {
        return field6;
    }

    public void setField6(double field6) {
        this.field6 = field6;
    }

    public boolean isField7() {
        return field7;
    }

    public void setField7(boolean field7) {
        this.field7 = field7;
    }

    @Override
    public String toString() {
        return "GsonObject [field1=" + field1 + ", field2=" + field2 + ", field3=" + field3 + ", field4=" + field4
            + ", field5=" + field5 + ", field6=" + field6 + ", field7=" + field7 + "]";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

测试代码:

@Test
public void test() throws IOException {
    Gson gson = new GsonBuilder()
        .setVersion(1)
        .addDeserializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes arg0) {
                return false;
            }
            @Override
            public boolean shouldSkipClass(Class<?> arg0) {
                return (arg0 == double.class || arg0 == Double.class);
            }
        }).create();
    String gsonStr = "{\"field1\":\"FIELD_A\"," 
        + "\"field2\":\"FIELD_B\"," 
        + "\"field3\":\"FIELD_C\"," 
        + "\"field4\":\"FIELD_D\"," 
        + "\"field5\":55," 
        + "\"field6\":99.99," 
        + "\"field7\":true}";
    System.out.println(gson.fromJson(gsonStr, GsonObject.class));
}

运行结果: 
这里写图片描述

包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值