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));  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值