1. 简介
ExclusionStrategy接口是Gson库提供的一种用于控制JSON序列化和反序列化过程中对象字段的过滤器。在某些场景下,我们可能并不希望将一个类的所有字段都转成JSON字符串或者反序列化成对象,我们需要对某些字段进行过滤,这时候就可以使用ExclusionStrategy接口来实现。
2. ExclusionStrategy接口方法
ExclusionStrategy接口中包含两个方法:
boolean shouldSkipField(FieldAttributes f)
boolean shouldSkipClass(Class> clazz)
shouldSkipField(FieldAttributes f):当该方法返回true时,表示将跳过序列化或反序列化过程中的该字段。
shouldSkipClass(Class> clazz):当该方法返回true时,表示将跳过序列化或反序列化过程中的该类。
3. 实现ExclusionStrategy接口
实现ExclusionStrategy接口需要重写上述两个方法。下面是一个根据字段名过滤的ExclusionStrategy实现。
public class MyExclusionStrategy implements ExclusionStrategy {
private final Set<String> fieldNamesToSkip;
public MyExclusionStrategy(String... fieldNames) {
this.fieldNamesToSkip = new HashSet<>(Arrays.asList(fieldNames));
}
public boolean shouldSkipField(FieldAttributes f) {
return fieldNamesToSkip.contains(f.getName());
}
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
上面的代码实现了一个MyExclusionStrategy类,该类的构造函数需要传入需要过滤的字段名称。通过重写shouldSkipField()方法实现根据字段名过滤JSON序列化和反序列化过程中的字段。
3.1 代码说明
Set<String> fieldNamesToSkip:用于存储需要过滤的字段名称的集合
MyExclusionStrategy(String... fieldNames):构造函数,接收需要过滤的字段名称列表,初始化fieldNamesToSkip集合
public boolean shouldSkipField(FieldAttributes f):根据字段名过滤需要序列化或反序列化的字段
public boolean shouldSkipClass(Class<?> clazz):不需要过滤要序列化或反序列化的类,返回false
4. 使用ExclusionStrategy进行序列化和反序列化
接下来演示一下如何在Java中使用ExclusionStrategy进行JSON序列化和反序列化。
4.1 JSON序列化
使用ExclusionStrategy进行JSON序列化需要使用到GsonBuilder类,在GsonBuilder对象中设置ExclusionStrategy。
MyClass myClass = new MyClass();
myClass.setName("myName");
myClass.setId(1);
myClass.setAge(18);
Gson gson = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy("id", "age"))
.create();
String json = gson.toJson(myClass);
System.out.println(json);
以上代码创建了一个MyClass对象,通过GsonBuilder对象设置了需要过滤的字段名称列表,创建Gson对象后进行序列化操作,最终输出结果如下:
{
"name": "myName"
}
可以看到,通过ExclusionStrategy过滤了id和age字段。
4.2 JSON反序列化
使用ExclusionStrategy进行JSON反序列化时,需要使用JsonReader类实现。在JsonReader对象中设置ExclusionStrategy。
String json = "{\"name\":\"myName\",\"id\":1,\"age\":18}";
JsonReader reader = new JsonReader(new StringReader(json));
reader.setLenient(true);
MyClass myClass = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy("id", "age"))
.create()
.fromJson(reader, MyClass.class);
System.out.println(myClass.getName());
以上代码将JSON字符串反序列化成对象时,通过JsonReader对象设置ExclusionStrategy,最终输出结果如下:
myName
可以看到,通过ExclusionStrategy过滤了id和age字段。
5. 总结
本文介绍了ExclusionStrategy接口的作用及其方法,以及如何实现一个ExclusionStrategy接口的方法来实现字段或类的过滤。另外,本文也演示了如何在Java中使用ExclusionStrategy进行JSON序列化和反序列化操作。需要注意的是,使用ExclusionStrategy进行序列化或反序列化操作时,需要使用GsonBuilder或JsonReader对象,通过其setExclusionStrategies()方法来设置ExclusionStrategy,在create()或fromJson()方法中使用该对象进行操作。