1. 程式人生 > >fastjson使用(三) -- 序列化

fastjson使用(三) -- 序列化

使用fastjson進行序列化,就是把JavaBean轉換為JSON格式的資料。

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

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

1.通過@JSONField定製序列化

2.通過@JSONType定製序列化

3.通過SerializeFilter定製序列化

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

一、通過@JSONField定製序列化

在實體類上的欄位,配置@JSONField。

// 配置序列化的時候,不序列化id
@JSONField(serialize=false)
private int id;
	
private String name; // 姓名
private int age; // 年齡
	
// 配置序列化的名稱
@JSONField(name="gender")
public String sex;
// 序列化的時候, 不序列化id, sex欄位序列化成gender
User user = new User();
user.setAge(10);
user.setDate(new Date());
user.setId(1); 
user.setName("李四");
user.setSex("男");
System.out.println("@JSONField --> " + JSON.toJSONString(user));
二、通過@JSONType定製序列化
/**
 * @ClassName: User 
 * @Description: 測試用的實體類,
 * 使用ignores屬性配置序列化的時候,不序列化id欄位
 * @author haoran.shu
 * @date 2015-12-30 下午5:24:23
 */
@JSONType(ignores = {"id"})
public class Uo implements Serializable {}
/**
 * @ClassName: User 
 * @Description: 測試用的實體類
 * 使用@JSONType配置只序列化name,sex欄位
 * @author haoran.shu
 * @date 2015-12-30 下午5:24:23
 */
@JSONType(includes={"name", "sex"})
public class Uo1 implements Serializable {}
注意和@JSONField不同的是,@JSONType是配置在類上的,而@JSONField是配置在欄位和方法上的
// 
Uo uo = new Uo();
uo.setAge(10);
uo.setDate(new Date());
uo.setId(1); 
uo.setName("李四");
uo.setSex("男");
System.out.println("@JSONType ignores --> " + JSON.toJSONString(uo));
		
// 
Uo1 uo1 = new Uo1();
uo1.setAge(10);
uo1.setDate(new Date());
uo1.setId(1); 
uo1.setName("李四");
uo1.setSex("男");
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中可以使用。

SerializeFilter filter = ...; // 可以是上面5個SerializeFilter的任意一種。
JSON.toJSONString(obj, filter);

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

1.PropertyPreFilter

/*
 *  定製序列化,只序列化一部分欄位, 將需要序列化的欄位名,配置到陣列中
 *  如果什麼都不配置,則序列化全部欄位
 */
// 只序列化name
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Group.class, new String[]{"name"});
System.out.println("SimplePropertyPreFilter --> " + JSON.toJSONString(group, filter));
2.PropertyFilter 
// 根據key和value判斷是否需要序列化
PropertyFilter filter2 = new PropertyFilter() {
<span style="white-space:pre">	</span>/**
 <span style="white-space:pre">	</span>* source來源類,一般為實體類
 <span style="white-space:pre">	</span>* 返回:
 <span style="white-space:pre">	</span>* 		true : 序列化
 <span style="white-space:pre">	</span>* 		false : 不序列化
 <span style="white-space:pre">	</span>*/
<span style="white-space:pre">	</span>@Override
	public boolean apply(Object source, String key, Object value) {
		if(key.equals("id")){
	<span style="white-space:pre">	</span>	if((int)value > 100){
		<span style="white-space:pre">		</span>return true;
		<span style="white-space:pre">	</span>}
		}else if(key.equals("name")){
			return true;
		}
		return false;
	}
};
System.out.println("PropertyFilter : " + JSON.toJSONString(group, filter2));
3.NameFilter 
// 序列化時修改key
NameFilter nameFilter = new NameFilter() {
	/**
	 * 如果需要修改Key,process返回值則可
	 * 返回需要修改後的key值,如果不修改,則返回name
	 * 切記不能返回null,否則會報錯
	 */
	@Override
	public String process(Object object, String name, Object value) {
		if(name.equals("id")){
			return "ID";
		}
		return name;
	}
};
System.out.println("NameFilter : " + JSON.toJSONString(group, nameFilter));

4.ValueFilter 
// 序列化時修改value
ValueFilter valueFilter = new ValueFilter() {
	
	@Override
	public Object process(Object object, String name, Object value) {
		if(name.equals("name")){
			return "張三";
		}
		return "";
	}
};
System.out.println("ValueFilter : " + JSON.toJSONString(group, valueFilter));
5.BeforeFilter
// 序列化時在最前新增內容
BeforeFilter beforeFilter = new BeforeFilter() {
	
	@Override
	public void writeBefore(Object object) {
		writeKeyValue("start", "bofore");
		writeKeyValue("start1", "bofore");
	}
};
System.out.println("BeforeFilter : " + JSON.toJSONString(group, beforeFilter));
6.AfterFilter
// 序列化之時在最後新增內容
AfterFilter afterFilter = new AfterFilter() {
			
	@Override
	public void writeAfter(Object object) {
		writeKeyValue("end", "after");
	}
};
System.out.println("AfterFilter : " + JSON.toJSONString(group, afterFilter));