Gson Builder — 忽略策略

作者: 無名小子的杂货铺 | 来源:发表于2016-12-05 16:34 被阅读2189次

    原文链接: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 开源库分享学习群,有兴趣的小伙伴可以加入一起学习。

    群二维码

    相关文章

      网友评论

        本文标题:Gson Builder — 忽略策略

        本文链接:https://www.haomeiwen.com/subject/cmlxmttx.html