Java对象和Json之间的互转,通常用的比较多的两个类库是Jackson和Gson,下面记录一下Gson的学习使用。json
基础概念:api
Serialization:序列化,使Java对象到Json字符串的过程。学习
Deserialization:反序列化,字符串转换成Java对象ui
Gson的两个基础方法spa
toJson();
fromJson();
Gson的建立方式一:直接new Gson对象code
// 使用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());
Gson的建立方式二:使用GsonBuilderorm
使用new Gson(),此时会建立一个带有默认配置选项的Gson实例,若是不想使用默认配置,那么就能够使用GsonBuilder。对象
//serializeNulls()是GsonBuilder提供的一种配置,当字段值为空或null时,依然对该字段进行转换 Gson gson = new GsonBuilder().serializeNulls().create();
使用GsonBuilder建立Gson实例的步骤:blog
首先建立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,调用toJson时会序列化该属性,
若是deserialize为true,调用fromJson生成Java对象时不会进行反序列化。
注意:
若是采用new Gson()方式建立Gson,@Expose没有任何效果。须要使用 gsonBuilder.excludeFieldsWithoutExposeAnnotation()方法。
@SerializedName注解 能指定该字段在序列化成json时的名称
@SerializedName("w") private int width;