Json一種非常常用的數據交換方式,又因爲我們現在Web框架使用的Easyui(其中最常用的table表格綁定的Json數據),Json的應用就必不可少了,我們現在從後臺數據庫得到的數據常用的類型是實體和list,都屬於集合,性質是一樣的,從實體或者list轉成Json數據傳到界面就是最關鍵的了。
其實Java中Json的解析方式有很多種,我們可以直接使用Java的JSONObject庫,除此之外還有fastjson,Gson,jackson等等這些Json處理類庫,共同之處不僅方便我們開發,轉換效率也更快。
今天我們先來看Gson——Google榮譽出品。
一、引入Jar包
如果是maven項目的話,直接pom中引入即可,當然也可以直接引入Jar包。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
二、使用,以List to Json爲例
使用上很簡單,最主要的三步:
//實例一個Gson
Gson gson = newGson();
//實例一個泛型的List(一般是從數據庫查詢返回)
List<Class> list = new ArrayList<Class>();
//調用轉換方法toJson即可
String json = gson.toJson(list);
三、實際問題
如果只想導出某個實體屬性或者實體中有關聯其他實體,我們並不想把關聯實體(list中嵌套這list)也導出到Json,尤其是後一種情況比較常見,之前我們是從list中remove不相關的內容,但是我們實體變得時候,之前remove就不可控制了。再來看通過Gson如何處理這種情況。
1、首先是在實體屬性上通過註解標識需要轉換的屬性
publicclass School{
@Expose
private String code;
@Expose
private String name;
private String remark
privateSet<Build> builds = new HashSet<Build>();
}
2、使用GsonBuilder
唯一不同於上面的是實例化的類是GsonBuilder,並且需要調用下面的方法:
Gson gson = newGsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //<span style="font-family:SimSun;">只導出實體中</span>用@Expose註解的屬性
.create();
默認情況下@Expose註解是不起作用的,除非你用GsonBuilder創建Gson的時候調用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法。
注:如果僅僅是想把某些特定的字段包含在外和話,可以使用transient 關鍵字聲明字段。
GsonBuilder常用的設置:
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation() //不導出實體中沒有用@Expose註解的屬性
.enableComplexMapKeySerialization() //支持Map的key爲複雜對象的形式
.serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//時間轉化爲特定格式
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會把字段首字母大寫,注:對於實體上使用了@SerializedName註解的不會生效.
.setPrettyPrinting() //對json結果格式化.
.setVersion(1.0) //有的字段不是一開始就有的,會隨着版本的升級添加進來,那麼在進行序列化和返序列化的時候就會根據版本號來選擇是否要序列化.
//@Since(版本號)能完美地實現這個功能.還的字段可能,隨着版本的升級而刪除,那麼
//@Until(版本號)也能實現這個功能,GsonBuilder.setVersion(double)方法需要調用.
.create();
四、小結
選擇轉換屬性問題解決了,如果就想把關聯的list轉換成Json呢,下文再繼續,繼續結合業務測試,繼續站在巨人的肩膀上。我們目前的問題肯定已經有了解決方案,待我們探索。
附一
李坤師哥:
http://blog.csdn.net/lk_blog/article/category/1172246?viewmode=list
附二
Google:
http://google-gson.googlecode.com/svn/tags/gson-2.3.1/docs/javadocs/com/google/gson/Gson.html
附三
性能測試:
網上測試有很多,普遍的反映出的是jackson對大數據量的裝換性能更好(10倍以上),不過都不是現在的最新版本,後面自己來個新版本的測試。