Android Gson详解(三)

来源:互联网 发布:win10输入法云计算 编辑:程序博客网 时间:2024/06/06 02:25

一、字段过滤的几种方法
1)基于@Expose注解

@Expose提供了两个属性,且都有默认值,开发者可以根据需要设置不同的值。
使用方法: 简单说来就是需要导出的字段上加上@Expose 注解,不导出的字段不加。注意是不导出的不加。

@Expose //@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效@Expose(deserialize = true,serialize = false) //反序列化时生效@Expose(deserialize = false,serialize = true) //序列化时生效@Expose(deserialize = false,serialize = false) // 和不写一样

注:根据上面的图片可以得出,所有值为true的属性都是可以不写的。

2)基于版本

Gson在对基于版本的字段导出提供了两个注解 @Since 和 @Until,和GsonBuilder.setVersion(Double)配合使用。@Since 和 @Until都接收一个Double值。

Since和Until注解
使用方法:当前版本(GsonBuilder中设置的版本) 大于等于Since的值时该字段导出,小于Until的值时该该字段导出。

class SinceUntilSample {    @Since(4)    public String since;    @Until(5)    public String until;}public void sineUtilTest(double version){        SinceUntilSample sinceUntilSample = new SinceUntilSample();        sinceUntilSample.since = "since";        sinceUntilSample.until = "until";        Gson gson = new GsonBuilder().setVersion(version).create();        System.out.println(gson.toJson(sinceUntilSample));}//当version <4时,结果:{"until":"until"}//当version >=4 && version <5时,结果:{"since":"since","until":"until"}//当version >=5时,结果:{"since":"since"}

注:当一个字段被同时注解时,需两者同时满足条件。

3)基于策略(自定义规则)

上面介绍的了2种排除字段的方法,说实话我除了@Expose以外,其它的都是只在Demo用上过,用得最多的就是马上要介绍的自定义规则,好处是功能强大、灵活,缺点是相比其它3种方法稍麻烦一点,但也仅仅只是想对其它3种稍麻烦一点而已。

基于策略是利用Gson提供的ExclusionStrategy接口,同样需要使用GsonBuilder,相关API 2个,分别是addSerializationExclusionStrategy 和addDeserializationExclusionStrategy 分别针对序列化和反序化时。这里以序列化为例。

例如:

Gson gson = new GsonBuilder()        .addSerializationExclusionStrategy(new ExclusionStrategy() {            @Override            public boolean shouldSkipField(FieldAttributes f) {                // 这里作判断,决定要不要排除该字段,return true为排除                if ("finalField".equals(f.getName())) return true; //按字段名排除                Expose expose = f.getAnnotation(Expose.class);                 if (expose != null && expose.deserialize() == false) return true; //按注解排除                return false;            }            @Override            public boolean shouldSkipClass(Class<?> clazz) {                // 直接排除某个类 ,return true为排除                return (clazz == int.class || clazz == Integer.class);            }        })        .create();