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 类
扫描二维码关注公众号,回复:
2803813 查看本文章
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));
}
运行结果: