Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
Gson原本是创造给Google内部人员使用并运用在目前的的很多Google项目中。现在被很多公共项目和公司所使用。
Gson的两个基础方法
toJson();
fromJson();
Gson的创建方式
一、直接new Gson对象
// 使用new方法
Gson gson = new Gson();
// toJson 将bean对象转换为json字符串
String jsonStr = gson.toJson(user, User.class);
// fromJson 将json字符串转为bean对象
Student user= gson.fromJson(jsonStr, User.class);
// **序列化List**
String jsonStr2 = gson.toJson(list);
// **反序列化成List时需要使用到TypeToken getType()**
List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType());
二:使用GsonBuilder
使用new Gson()
,此时会创建一个带有默认配置选项的Gson实例,如果不想使用默认配置,那么就可以使用GsonBuilder
。
serializeNulls()
是GsonBuilder提供的一种配置,当字段值为空或null时,依然对该字段进行转换
Gson gson = new GsonBuilder().serializeNulls().create();
使用GsonBuilder创建Gson实例的步骤:
- 创建GsonBuilder,
- 调用GsonBuilder提供的各种配置方法进行配置,
- 调用GsonBuilder的create方法,将基于当前的配置创建一个Gson实例。
GsonBuilder的一些配置
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //不对没有用@Expose注解的属性进行操作
.enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法
.serializeNulls() //当字段值为空或null时,依然对该字段进行转换
.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //时间转化为特定格式
.setPrettyPrinting() //对结果进行格式化,增加换行
.disableHtmlEscaping() //防止特殊字符出现乱码
.registerTypeAdapter(User.class,new UserAdapter()) //为某特定对象设置固定的序列或反序列方式,自定义Adapter需实现JsonSerializer或者JsonDeserializer接口
.create();
Gosn对复杂Map的处理时需要用到其中的 enableComplexMapKeySerialization() 配置:
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); //开启复杂处理Map方法
Map<List<User>, String> map = new HashMap<List<User>, String>();
// TODO 向map中添加数据
String jsonStr = gson.toJson(map); //toJson
Map<List<User>, String> resultMap = gson.fromJson(jsonStr,new TypeToken<Map<List<User>, String>>() {}.getType()); //fromJson
注意:如果Map的key为String,则可以不使用GsonBuilder的enableComplexMapKeySerialization()方法,或者直接new Gson();
Gson的注解:
@Expose注解
用于类属性是否序列化
和反序列化
public class User {
@Expose
private String firstName;
@Expose(serialize = false)
private String lastName;
@Expose(deserialize = false)
private String emailAddress;
private String password;
}
@Expose
中serialize
和deserialize
属性是可选的,默认两个都为true
。
如果serialize
为true
,调用toJso
n时会序列化该属性,
如果deserialize
为true
,调用fromJson
生成Java对象时不会进行反序列化。
注意:如果采用`new Gson()`方式创建Gson,`@Expose`没有任何效果。需要使用`gsonBuilder.excludeFieldsWithoutExposeAnnotation()`方法。
@SerializedName注解
能指定该字段在序列化成json时的名称
@SerializedName("w")
private int width;