fastjson使用(三) -- 序列化
阿新 • • 發佈:2019-02-19
使用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));