fastjson使用(三) -- 序列化

https://blog.csdn.net/u011113654/article/details/50460787

使用fastjson進行序列化,就是把JavaBean轉換爲JSON格式的數據。

fastjson的序列化高度可控性,可以自己定製序列化。

fastjson的定製序列化有很多中實現方式,主要有如下的方式:

1.通過@JSONField定製序列化

2.通過@JSONType定製序列化

3.通過SerializeFilter定製序列化

下面依次講每一種方式的實現:

一、通過@JSONField定製序列化

在實體類上的字段,配置@JSONField。

[java] view plain copy
  1. // 配置序列化的時候,不序列化id  
  2. @JSONField(serialize=false)  
  3. private int id;  
  4.       
  5. private String name; // 姓名  
  6. private int age; // 年齡  
  7.       
  8. // 配置序列化的名稱  
  9. @JSONField(name="gender")  
  10. public String sex;  

[java] view plain copy
  1. // 序列化的時候, 不序列化id, sex字段序列化成gender  
  2. User user = new User();  
  3. user.setAge(10);  
  4. user.setDate(new Date());  
  5. user.setId(1);   
  6. user.setName("李四");  
  7. user.setSex("男");  
  8. System.out.println("@JSONField --> " + JSON.toJSONString(user));  
二、通過@JSONType定製序列化

[java] view plain copy
  1. /** 
  2.  * @ClassName: User  
  3.  * @Description: 測試用的實體類, 
  4.  * 使用ignores屬性配置序列化的時候,不序列化id字段 
  5.  * @author haoran.shu 
  6.  * @date 2015-12-30 下午5:24:23 
  7.  */  
  8. @JSONType(ignores = {"id"})  
  9. public class Uo implements Serializable {}  
[java] view plain copy
  1. /** 
  2.  * @ClassName: User  
  3.  * @Description: 測試用的實體類 
  4.  * 使用@JSONType配置只序列化name,sex字段 
  5.  * @author haoran.shu 
  6.  * @date 2015-12-30 下午5:24:23 
  7.  */  
  8. @JSONType(includes={"name""sex"})  
  9. public class Uo1 implements Serializable {}  
注意和@JSONField不同的是,@JSONType是配置在類上的,而@JSONField是配置在字段和方法上的
[java] view plain copy
  1. //   
  2. Uo uo = new Uo();  
  3. uo.setAge(10);  
  4. uo.setDate(new Date());  
  5. uo.setId(1);   
  6. uo.setName("李四");  
  7. uo.setSex("男");  
  8. System.out.println("@JSONType ignores --> " + JSON.toJSONString(uo));  
  9.           
  10. //   
  11. Uo1 uo1 = new Uo1();  
  12. uo1.setAge(10);  
  13. uo1.setDate(new Date());  
  14. uo1.setId(1);   
  15. uo1.setName("李四");  
  16. uo1.setSex("男");  
  17. System.out.println("@JSONType includes --> " + JSON.toJSONString(uo1));  

三、通過SerializeFilter定製序列化

通過SerializeFilter可以使用擴展編程的方式實現定製序列化。fastjson提供了多種SerializeFilter:

  • PropertyPreFilter 根據PropertyName判斷是否序列化
  • PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化
  • NameFilter 修改Key,如果需要修改Key,process返回值則可
  • ValueFilter 修改Value
  • BeforeFilter 序列化時在最前添加內容
  • AfterFilter 序列化時在最後添加內容

以上的SerializeFilter在JSON.toJSONString中可以使用。

[java] view plain copy
  1. SerializeFilter filter = ...; // 可以是上面5個SerializeFilter的任意一種。  
  2. JSON.toJSONString(obj, filter);  

下面介紹每一種SerializeFilter的使用:

1.PropertyPreFilter

[java] view plain copy
  1. /* 
  2.  *  定製序列化,只序列化一部分字段, 將需要序列化的字段名,配置到數組中 
  3.  *  如果什麼都不配置,則序列化全部字段 
  4.  */  
  5. // 只序列化name  
  6. SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Group.classnew String[]{"name"});  
  7. System.out.println("SimplePropertyPreFilter --> " + JSON.toJSONString(group, filter));  
2.PropertyFilter 

[java] view plain copy
  1. // 根據key和value判斷是否需要序列化  
  2. PropertyFilter filter2 = new PropertyFilter() {  
  3. <span style="white-space:pre">    </span>/** 
  4.  <span style="white-space:pre">   </span>* source來源類,一般爲實體類 
  5.  <span style="white-space:pre">   </span>* 返回: 
  6.  <span style="white-space:pre">   </span>*      true : 序列化 
  7.  <span style="white-space:pre">   </span>*      false : 不序列化 
  8.  <span style="white-space:pre">   </span>*/  
  9. <span style="white-space:pre">    </span>@Override  
  10.     public boolean apply(Object source, String key, Object value) {  
  11.         if(key.equals("id")){  
  12.     <span style="white-space:pre">    </span>   if((int)value > 100){  
  13.         <span style="white-space:pre">        </span>return true;  
  14.         <span style="white-space:pre">    </span>}  
  15.         }else if(key.equals("name")){  
  16.             return true;  
  17.         }  
  18.         return false;  
  19.     }  
  20. };  
  21. System.out.println("PropertyFilter : " + JSON.toJSONString(group, filter2));  
3.NameFilter 
[java] view plain copy
  1. // 序列化時修改key  
  2. NameFilter nameFilter = new NameFilter() {  
  3.     /** 
  4.      * 如果需要修改Key,process返回值則可 
  5.      * 返回需要修改後的key值,如果不修改,則返回name 
  6.      * 切記不能返回null,否則會報錯 
  7.      */  
  8.     @Override  
  9.     public String process(Object object, String name, Object value) {  
  10.         if(name.equals("id")){  
  11.             return "ID";  
  12.         }  
  13.         return name;  
  14.     }  
  15. };  
  16. System.out.println("NameFilter : " + JSON.toJSONString(group, nameFilter));  

4.ValueFilter 
[java] view plain copy
  1. // 序列化時修改value  
  2. ValueFilter valueFilter = new ValueFilter() {  
  3.       
  4.     @Override  
  5.     public Object process(Object object, String name, Object value) {  
  6.         if(name.equals("name")){  
  7.             return "張三";  
  8.         }  
  9.         return "";  
  10.     }  
  11. };  
  12. System.out.println("ValueFilter : " + JSON.toJSONString(group, valueFilter));  
5.BeforeFilter
[java] view plain copy
  1. // 序列化時在最前添加內容  
  2. BeforeFilter beforeFilter = new BeforeFilter() {  
  3.       
  4.     @Override  
  5.     public void writeBefore(Object object) {  
  6.         writeKeyValue("start""bofore");  
  7.         writeKeyValue("start1""bofore");  
  8.     }  
  9. };  
  10. System.out.println("BeforeFilter : " + JSON.toJSONString(group, beforeFilter));  
6.AfterFilter

[java] view plain copy
  1. // 序列化之時在最後添加內容  
  2. AfterFilter afterFilter = new AfterFilter() {  
  3.               
  4.     @Override  
  5.     public void writeAfter(Object object) {  
  6.         writeKeyValue("end""after");  
  7.     }  
  8. };  
  9. System.out.println("AfterFilter : " + JSON.toJSONString(group, afterFilter));  

發佈了20 篇原創文章 · 獲贊 197 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章