1、
2、SerializedName属性值映射
- @SerializedName("email_address")
public String emailAddress; - 备选属性,只要命中其中一个就行,格式如 @SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
3、Gson中使用泛型 TypeToken
当我们要通过Gson解析这个jsonArray时,一般有两种方式:使用数组,使用List。而List对于增删都是比较方便的,所以实际使用是还是List比较多。
数组比较简单:
String jsonArray = "["Android","Java","PHP"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
但对于List将上面的代码中的 String[].class 直接改为 List<String>.class 是行不通的。对于Java来说 List<String> 和 List<User> 这俩个的字节码文件只一个那就是 List.class,这是Java泛型使用时要注意的问题:泛型擦除。
为了解决的上面的问题,Gson为我们提供了 TypeToken 来实现对泛型的支持,所以当我们希望使用将以上的数据解析为 List<String> 时需要这样写:
List<String> list = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
注:TypeToken的构造方法是 protected 修饰的,所以上面才会写成【new TypeToken<List<String>>() {}.getType()】而不是【new TypeToken<List<String>>().getType()】
4、使用GsonBuilder配置Gson
5、字段过滤的四种方法
-
于注解@Expose 结合GsonBuilder使用
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();//不配置时注解无效
-
基于版本和注解@Since @Until
Gson在对基于版本的字段导出提供了两个注解 @Since 和 @Until,需要和GsonBuilder.setVersion(Double)配合使用
Since和Until注解的定义:@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.TYPE})
public @interface Since{
double value();
} 使用规则:当GsonBuilder中设置的版本大于等于Since的值时该字段导出,小于Until的值时该该字段导出;当一个字段被@Since和@Until同时注解时,需两者同时满足条件。 -
TypeAdapter 自定义(反)序列化
-
Json(De)Serializer
- 注解 @JsonAdapter