使用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可以使用扩展编程的方式实现定制序列化。fastjson提供了多种SerializeFilter:
以上的SerializeFilter在JSON.toJSONString中可以使用。
SerializeFilter filter = ...; // 可以是上面5个SerializeFilter的任意一种。 JSON.toJSONString(obj, filter);
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));
// 序列化时修改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));