Gson

使用ava關鍵字transient

 

Java代碼  收藏代碼
  1. private transient int value = 3;  

在序列化的時候value不會生成到json字符串中。

 

使用Gson提供的註解@Expose

 

Java代碼  收藏代碼
  1. @Exclude  
  2. private String value;  

 

 當然,要使用這個屬性必須通過以下語句來構造Gson對象

 

Java代碼  收藏代碼
  1. new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()  

 我們也可以自定義註解來標註需要過濾的屬性,參見官方的User Guide,需要使用到過濾策略,在下文也會提到。

 

使用排除策略

 

以上只能是通過“硬編碼”的方式來排除屬性,有些時候我們需要根據某種來選擇性得過濾一些屬性。這是我們可以使用使用Gson提供的排除策略ExclusionStrategy接口。如:

 

Java代碼  收藏代碼
  1. public class MyExclusionStrategy implements ExclusionStrategy {  
  2.     private MyExclusionStrategy(Class<?> typeToSkip) {  
  3.         
  4.     }  
  5.   
  6.     public boolean shouldSkipClass(Class<?> clazz) {  
  7.       return false;  
  8.     }  
  9.   
  10.     public boolean shouldSkipField(FieldAttributes f) {  
  11.       return false;  
  12.     }  
  13.   }  

 

我們可以通過類級別和屬性級別來過濾屬性。以上提到的關於自定義註解的實現是在屬性級別上實現的。具體方法是

 

Java代碼  收藏代碼
  1. public boolean shouldSkipField(FieldAttributes f) {  
  2.       // Foo是一個自定義註解  
  3.       return f.getAnnotation(Foo.class) != null;  
  4.     }  

 

一般情況下,我們可以通過根據屬性名的判斷來實現實現邏輯過濾。當然,在序列化之前,需要用一下代碼來構造Gson對象:

 

Java代碼  收藏代碼
  1. Gson gson = new GsonBuilder()  
  2.        .setExclusionStrategies(new MyExclusionStrategy(SomeObject.class))  
  3.        .create();  

 

自定義序列化器 

在有些情況下,我們可能會爲某一個類來綁定一種序列化或反序列化器。

 

Java代碼  收藏代碼
  1. public class MyAdaper1 implements JsonSerializer<DataStore> {  
  2.   
  3.     @Override  
  4.     public JsonElement serialize(DataStore src, Type typeOfSrc,  
  5.             JsonSerializationContext context) {  
  6.         ExclusionStrategy strategy = new DmsExclusionStrategy(  
  7.                 src.getExcludeFields(), src.getExcludeClasses());  
  8.         Gson gson = new GsonBuilder().setExclusionStrategies(strategy)  
  9.                 .serializeNulls().create();  
  10.         return gson.toJsonTree(src);  
  11.     }  
  12. }  

 註冊序列化器:

 

Java代碼  收藏代碼
  1. GsonBuilder builder = new GsonBuilder();  
  2. builder.registerTypeAdapter(MyType1.classnew MyTypeAdapter())  
  3. .registerTypeAdapter(MyType2.classnew MyTypeAdapter2());  

 

最佳實踐——綜合使用自定義序列化器和排除策略

通常情況下,我們一下如下定義排除策略

 

Java代碼  收藏代碼
  1. public class DmsExclusionStrategy implements ExclusionStrategy {  
  2.     public DmsExclusionStrategy() {  
  3.   
  4.     }  
  5.   
  6.     public DmsExclusionStrategy(String[] excludeFields,  
  7.             Class<?>[] excludeClasses) {  
  8.         this.excludeFields = excludeFields;  
  9.         this.excludeClasses = excludeClasses;  
  10.     }  
  11.   
  12.     private String[] excludeFields;  
  13.     private Class<?>[] excludeClasses;  
  14.   
  15.     public boolean shouldSkipClass(Class<?> clazz) {  
  16.         if (this.excludeClasses == null) {  
  17.             return false;  
  18.         }  
  19.   
  20.         for (Class<?> excludeClass : excludeClasses) {  
  21.             if (excludeClass.getName().equals(clazz.getName())) {  
  22.                 return true;  
  23.             }  
  24.         }  
  25.   
  26.         return false;  
  27.     }  
  28.   
  29.     public boolean shouldSkipField(FieldAttributes f) {  
  30.         if (this.excludeFields == null) {  
  31.             return false;  
  32.         }  
  33.   
  34.         for (String field : this.excludeFields) {  
  35.             if (field.equals(f.getName())) {  
  36.                 return true;  
  37.             }  
  38.         }  
  39.   
  40.         return false;  
  41.     }  
  42.   
  43.     public final String[] getExcludeFields() {  
  44.         return excludeFields;  
  45.     }  
  46.   
  47.     public final Class<?>[] getExcludeClasses() {  
  48.         return excludeClasses;  
  49.     }  
  50. }  
 

定義一個排除模型:

 

 

Java代碼  收藏代碼
  1. public class Excludable {  
  2.     /** 
  3.      * 不需要序列化的域. 
  4.      */  
  5.     private transient String[] excludeFields;  
  6.   
  7.     /** 
  8.      * 不需要序列化的類. 
  9.      */  
  10.     private transient Class<?>[] excludeClasses;  
  11.   
  12.     public void setExcludeFields(String[] excludeFields) {  
  13.         this.excludeFields = excludeFields;  
  14.     }  
  15.   
  16.     public String[] getExcludeFields() {  
  17.         return excludeFields;  
  18.     }  
  19.   
  20.     public void setExcludeClasses(Class<?>[] excludeClasses) {  
  21.         this.excludeClasses = excludeClasses;  
  22.     }  
  23.   
  24.     public Class<?>[] getExcludeClasses() {  
  25.         return excludeClasses;  
  26.     }  
  27. }  
 

當我們需要爲某個類應用過濾策略時,我們讓這個類繼承Excludable,自定義其相應的序列化器,在序列化的過程中應用排除策略。

 

Java代碼  收藏代碼
  1. public class MyTypeSerializer implements JsonSerializer<MyType> {  
  2.   
  3.     @Override  
  4.     public JsonElement serialize(MyType src, Type typeOfSrc,  
  5.             JsonSerializationContext context) {  
  6.         ExclusionStrategy strategy = new DmsExclusionStrategy(  
  7.                 src.getExcludeFields(), src.getExcludeClasses());  
  8.         Gson gson = new GsonBuilder().setExclusionStrategies(strategy)  
  9.                 .serializeNulls().create();  
  10.         return gson.toJsonTree(src);  
  11.     }  
  12. }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章