一、字段过滤的几种方法 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();