Gson的入门使用
轉(zhuǎn)載自??Gson的入門(mén)使用
Java對(duì)象和Json之間的互轉(zhuǎn),一般用的比較多的兩個(gè)類(lèi)庫(kù)是Jackson和Gson,下面記錄一下Gson的學(xué)習(xí)使用。
基礎(chǔ)概念:
?Serialization:序列化,使Java對(duì)象到Json字符串的過(guò)程。
?Deserialization:反序列化,字符串轉(zhuǎn)換成Java對(duì)象
使用Maven管理Gson,pom.xml導(dǎo)入gson的依賴(lài)
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.3.1</version></dependency>Gson的兩個(gè)基礎(chǔ)方法
toJson(); fromJson();?
Gson的創(chuàng)建方式一:直接new Gson對(duì)象
// 使用new方法 Gson gson = new Gson();// toJson 將bean對(duì)象轉(zhuǎn)換為json字符串 String jsonStr = gson.toJson(user, User.class);// fromJson 將json字符串轉(zhuǎn)為bean對(duì)象 Student user= gson.fromJson(jsonStr, User.class);// **序列化List** String jsonStr2 = gson.toJson(list);// **反序列化成List時(shí)需要使用到TypeToken getType()** List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType());?
Gson的創(chuàng)建方式二:使用GsonBuilder
使用new Gson(),此時(shí)會(huì)創(chuàng)建一個(gè)帶有默認(rèn)配置選項(xiàng)的Gson實(shí)例,如果不想使用默認(rèn)配置,那么就可以使用GsonBuilder。
//serializeNulls()是GsonBuilder提供的一種配置,當(dāng)字段值為空或null時(shí),依然對(duì)該字段進(jìn)行轉(zhuǎn)換 Gson gson = new GsonBuilder().serializeNulls().create();?使用GsonBuilder創(chuàng)建Gson實(shí)例的步驟:
首先創(chuàng)建GsonBuilder,然后調(diào)用GsonBuilder提供的各種配置方法進(jìn)行配置,
最后調(diào)用GsonBuilder的create方法,將基于當(dāng)前的配置創(chuàng)建一個(gè)Gson實(shí)例。
?
GsonBuilder的一些配置
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation() //不對(duì)沒(méi)有用@Expose注解的屬性進(jìn)行操作.enableComplexMapKeySerialization() //當(dāng)Map的key為復(fù)雜對(duì)象時(shí),需要開(kāi)啟該方法.serializeNulls() //當(dāng)字段值為空或null時(shí),依然對(duì)該字段進(jìn)行轉(zhuǎn)換.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") //時(shí)間轉(zhuǎn)化為特定格式.setPrettyPrinting() //對(duì)結(jié)果進(jìn)行格式化,增加換行.disableHtmlEscaping() //防止特殊字符出現(xiàn)亂碼.registerTypeAdapter(User.class,new UserAdapter()) //為某特定對(duì)象設(shè)置固定的序列或反序列方式,自定義Adapter需實(shí)現(xiàn)JsonSerializer或者JsonDeserializer接口.create();例如:Gosn對(duì)復(fù)雜Map的處理時(shí)需要用到其中的 enableComplexMapKeySerialization() 配置:
Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create(); //開(kāi)啟復(fù)雜處理Map方法 Map<List<User>, String> map = new HashMap<List<User>, String>(); // TODO 向map中添加數(shù)據(jù) 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 {@Exposeprivate String firstName;@Expose(serialize = false)private String lastName;@Expose(deserialize = false)private String emailAddress;private String password; }@Expose中serialize和deserialize屬性是可選的,默認(rèn)兩個(gè)都為true。
如果serialize為true,調(diào)用toJson時(shí)會(huì)序列化該屬性,
如果deserialize為true,調(diào)用fromJson生成Java對(duì)象時(shí)不會(huì)進(jìn)行反序列化。
注意:如果采用new Gson()方式創(chuàng)建Gson,@Expose沒(méi)有任何效果。需要使用
gsonBuilder.excludeFieldsWithoutExposeAnnotation() 方法。
@SerializedName注解 ? ?能指定該字段在序列化成json時(shí)的名稱(chēng)
@SerializedName("w")private int width;實(shí)際開(kāi)發(fā)中我們會(huì)遇到比較復(fù)雜的Json,比如json中嵌套json數(shù)組,這個(gè)時(shí)候,就需要我們自定義序列化或反序列化方法了。
待續(xù)未完....
?
參考:
http://www.jianshu.com/p/fc5c9cdf3aab
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: art-template入门(九)之AP
- 下一篇: 聚簇索引和聚簇索引介绍