原文链接:Gson Builder — Exclusion Strategies
原文出自:Norman Peitek
译者:無名無
在之前的文章中,我们已经了解一些方法来控制序列化和反序列化的值,不过这些规则都只是停留在单个字段的属性上,本文将介绍另一种规则来规定解析过程。
使用忽略策略 @Expose 和 transient 失效
之前文章学习使用 @Expose 和 transient 来改变单个字段的序列化和反序列化规则,接下来来看一种更通用的方式,Gson 提供的 ExclusionStrategies。
看例子:
public class UserDate {
private String _name;
private String email;
private boolean isDeveloper;
private int age;
private Date registerDate = new Date();
}
我们要通过 ExclusionStrategies 将 Date 和 boolean 类型的字段忽略,同样我们需要使用到 GsonBuilder :
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return false;
}
@Override
public boolean shouldSkipClass(Class<?> incomingClass) {
return incomingClass == Date.class || incomingClass == boolean.class;
}
});
Gson gson = gsonBuilder.create();
UserDate user = new UserDate("Norman", "norman@futurestud.io", 26, true);
String usersJson = gson.toJson(user);
这个 ExclusionStrategy 包含两个可重写的方法,上面的规则只使用了 shouldSkipClass 这个方法,看代码就很容易理解,凡事遇到 Date.class 或者 boolean.class 都将被忽略。
结果如下:
{
"age": 26,
"email": "norman@futurestud.io",
"_name": "Norman"
}
另一个方法 shouldSkipField 是用来忽略单个字段的,如果你想要忽略带有 “_” 的字段,可以这么写:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setExclusionStrategies(new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getName().contains("_");
}
@Override
public boolean shouldSkipClass(Class<?> incomingClass) {
return incomingClass == Date.class || incomingClass == boolean.class;
}
});
Gson gson = gsonBuilder.create();
UserDate user = new UserDate("Norman", "norman@futurestud.io", 26, true);
String usersJson = gson.toJson(user);
结果如下:
{
"age": 26,
"email": "norman@futurestud.io"
}
有了 ExclusionStrategies 我们可以根据自己的需求定制更多不同的规则,需要注意创建对应的 GsonBuilder,并正确使用方法。
UserDate 类中只是一些简单的数据类型,还有一些更复杂的情况,同样都可以使用 ExclusionStrategies 规则来帮我们实现,理论上 Gson 能帮我们忽略任何类。
关于 Exclusion Strategies 序列化使用
上面的例子使用的是 setExclusionStrategies 方法,不管是序列化还是反序列化都会起作用,如果我们只想其中一个起作用,选择调下面的方法就行了:
- addSerializationExclusionStrategy()
- addDeserializationExclusionStrategy()
用法和 ExclusionStrategy 的实现一样,可重写两个方法实现。
基于 Modifiers 的忽略规则
之前使用 transient 属性来忽略字段,GsonBuilder 提供 excludeFieldsWithModifiers() 方法,让我们可以自定义可忽略类型,要用到 java.lang.reflect.Modifier 类。
例如:
public class UserModifier {
private String name;
private transient String email;
private static boolean isDeveloper;
private final int age;
}
如果你想忽略 final 和 static 类型的字段, 保留 transient 类型的字段,需要这么配置:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.excludeFieldsWithModifiers(Modifier.STATIC, Modifier.FINAL);
Gson gson = gsonBuilder.create();
UserModifier user = new UserModifier("Norman", "norman@fs.io", 26, true);
String usersJson = gson.toJson(user);
输出:
{
"email": "norman@fs.io",
"name": "Norman"
}
达到这样的效果,是因为我们重新设置了 excludeFieldsWithModifiers() 方法的参数,Modifier.STATIC, Modifier.FINAL,根据这两个类型,就可以只忽略设置的类型,如果参数为空,将不起作用。
@Expose 使用
这个之前已经介绍了,可查看这篇文,需要注意的是手动设置 excludeFieldsWithoutExposeAnnotation() 方法才能生效。
总结
了解如何使用 ExclusionStrategies 来自定义规则,不管是通过 class 类型还是通过字段类型。
也了解了ExclusionStrategies 的两种实现方式,即只实现序列化或反序列化一种。
练习代码已上传 Github https://github.com/whiskeyfei/Gson-Review 可自行查看。
Gson 系列文章翻译回顾
1、Gson - Java-JSON 序列化和反序列化入门
2、Gson - 映射嵌套对象
3、Gson - Arrays 和 Lists 映射对象
4、Gson - Map 结构映射
5、Gson - Set 集合映射
6、Gson - 空值映射
7、Gson Model Annotations - 如何使用 @SerializedName 更改字段的命名
8、Gson Model Annotations - @SerializedName 匹配多个反序列化名称
9、Gson Builder - 基础和命名规则
10、Gson Builder - 序列化空值
11、Gson Builder - 忽略策略
12、Gson Builder - Gson Lenient 属性
13、Gson Builder - 特殊类型 Floats & Doubles
17、Gson Builder - 如何使用 @Expose 忽略字段
19、Gson Advanced - 映射枚举类型
20、Gson Advanced - 映射循环引用
21、Gson Advanced - 泛型
22、Gson Advanced - 简单自定义序列化 (Part 1)
24、Gson Advanced - 自定义反序列化基础
25、Gson Advanced - 自定义对象实例创建
26、Gson Advanced - 通过 @JsonAdapter 自定义(反)序列化过程
32、Practical Gson - 如何解析多态对象
学习讨论
刚刚建了一个 Android 开源库分享学习群,有兴趣的小伙伴可以加入一起学习。
群二维码
网友评论