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

你可能感兴趣的:(java,json,fastjson)