在java中採用ajax技術難免會遇到將java對象序列化的問題,而json作為一種輕量級且易懂易操作的資料格式得到廣泛的應用。所以,這裡我們講一下將Java對象序列化為Json資料的方法,這裡主要講一下google開發的開源工具Gson。
Gson繼承了Google的優良傳統,簡單易用。Gson這個Java類庫可以把Java對象轉換成JSON,也可以把JSON字串轉換成一個相等的Java對象。Gson支援任意複雜Java對象包括沒有原始碼的對象。
這裡我們主要講一下Gson在序列化時一些需要注意的操作,一般的應用網上都有大量的資料,最好的方法還是查看API
我們這裡先寫個轉化為Json資料的通用工具類ConvertToJson.java
package meetyou.util;import java.lang.reflect.Type;import java.util.List;import com.google.gson.Gson;import com.google.gson.GsonBuilder;public class ConvertToJson {public static String toJsonWithGson(Object obj){Gson gson=new Gson();return gson.toJson(obj);}public static String toJsonWithGson(Object obj,Type type){Gson gson=new Gson();return gson.toJson(obj,type);}@SuppressWarnings("unchecked")public static String toJsonWithGson(List list){Gson gson=new Gson();return gson.toJson(list);}@SuppressWarnings("unchecked")public static String toJsonWithGson(List list,Type type){Gson gson=new Gson();return gson.toJson(list,type);}public static String toJsonWithGsonBuilder(Object obj){Gson gson=new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();return gson.toJson(obj);}public static String toJsonWithGsonBuilder(Object obj,Type type){Gson gson=new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();return gson.toJson(obj,type);}@SuppressWarnings("unchecked")public static String toJsonWithGsonBuilder(List list){Gson gson=new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();return gson.toJson(list);}@SuppressWarnings("unchecked")public static String toJsonWithGsonBuilder(List list,Type type){Gson gson=new GsonBuilder().setExclusionStrategies(new MyExclusionStrategy()).serializeNulls().create();return gson.toJson(list,type);}}
從代碼我們開始講
1、Gson如何使用。
Gson對象主要有兩個方法toJson()序列化,fromJson()還原序列化
2、如何擷取Gson對象
兩種方式,1、new Gson().2、new GsonBuilder().create();
3、兩種方式擷取gson對象的區別
利用GsonBuilder建立gson對象時,可以增加一些特殊處理,應該說是比第一種方式功能更強大
4、參數中的type如何建立
(1)、普通對象,如User user=new User();得到type方式,user.class
(2)、複雜點的對象,如List<User> users=new ArrayList<User>();得到type方式,new com.google.gson.reflect.TypeToken<List<User>>(){}.getType()
5、GsonBuilder有哪些優勢
(1)、可以採用註解的方式,個人化定製需要序列化和方序列化的欄位,如在欄位前面添加@Expose註解,當採用GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法時,沒有該註解的欄位將被排除在外。其他註解還有@SerializeName、@Since和@Until,具體意思參見Gson API文檔
(2)、定製自己的註解和排除策略。如上述代碼中的類 MyExclusionStrategy,代碼如下
package meetyou.util;import com.google.gson.ExclusionStrategy;import com.google.gson.FieldAttributes;public class MyExclusionStrategy implements ExclusionStrategy {private final Class<?> typeToSkip;public MyExclusionStrategy(){this.typeToSkip=null;}public MyExclusionStrategy(Class<?> typeToSkip) {this.typeToSkip = typeToSkip;}public boolean shouldSkipClass(Class<?> clazz) {return (clazz == typeToSkip);}public boolean shouldSkipField(FieldAttributes f) {return f.getAnnotation(NotSerialize.class) != null;}}實現ExclusionStrategy介面
自己的註解介面NotSerialize,代碼如下
package meetyou.util;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface NotSerialize {}這時,我們用的時候,只要在不序列化的欄位前面加上@NotSerialize註解(比如說密碼欄位,保證其安全性就沒必要序列化出來了),採用new GsonBuilder().setExclusionStrategies()方法設定排除策略建立的Gson對象時,該欄位將不再被序列化
至於Gson的還原序列化,這裡就不講了。參考Gson API文檔吧