fastjson使用(四) -- 反序列化

上一篇博客讲了,fastjson的序列化使用,这一篇博客来讲解一下fastjson反序列化的使用。

一、反序列化

JSONObject object = new JSONObject();
object.put("id", 1);
object.put("name", "一年级");
object.put("class", "1");
		
Group group = JSON.parseObject(object.toJSONString(), Group.class);
System.out.println("反序列化:" + group.toString());


二、定制反序列化

fastjson的定制反序列化,分为两步:

1.使用@JSONField配置反序列化

2.使用ExtraProcessor和ExtraTypeProvider处理多余字段

我们首先来看一下第2步,使用ExtraProcessor和ExtraTypeProvider处理多余字段

private static class MyProcesser implements ExtraProcessor, ExtraTypeProvider {
		
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * 处理多余字段的类型
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public Type getExtraType(Object object, String key) {
	<span style="white-space:pre">	</span>System.out.println("type --> " + key);
	<span style="white-space:pre">	</span>if(key.equals("class")){
		<span style="white-space:pre">	</span>return int.class;
	<span style="white-space:pre">	</span>}
	<span style="white-space:pre">	</span>return null;
<span style="white-space:pre">	</span>}
		
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * 处理多余字段时的回调
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>public void processExtra(Object object, String key, Object value) {
	<span style="white-space:pre">	</span>System.out.println(key + " : " + value);
<span style="white-space:pre">	</span>}

}
// 处理多余字段
Group group2 = JSON.parseObject(object.toJSONString(), Group.class, new MyProcesser());
System.out.println("处理多余字段:" + group2.toString());
这一步,我们几乎很少用到,大多数时候,我们遇到多余字段时都是直接跳过,忽略,所以上面的我们只需要了解一下,以便以后如果有需求的时候使用;我们使用的最多的就是在反序列化的时候,配置反序列化的名称,还有某个实体类的某个字段,不反序列化等等,这个时候我们就需要通过@JSONField来配置实体类了。

// 配置序列化的时候,不序列化id
JSONField(serialize=false)
private int id;
	
private String name; // 姓名
private int age; // 年龄
	
// 配置序列化的名称
@JSONField(name="gender")
public String sex;
	
// 配置format只在序列化(JavaBean --> json)的时候有用
@JSONField(format="yyyyMMdd")
private Date date = new Date();
	
	
public String getName() {
	return name;
}
// 配置某个字段不能反序列化,需要配置到对应字段的setXX()方法
@JSONField(deserialize=false)
public void setName(String name) {
	this.name = name;
}

JSONObject userObject = new JSONObject();
userObject.put("id", "1");
userObject.put("name", "LiLei");
userObject.put("age", 26.5);
userObject.put("gender", "男");
User user = JSON.parseObject(userObject.toJSONString(), User.class);
System.out.println(user.toString());

仔细一点的同学,观察上面的代码会发现,我声明实体类的时候,id和age是int类型的,但是我构建JSON语句的时候,id存的是String类型的,age存的是double类型的,那么这样反序列化为实体对象时,会怎么样呢?我们通过结果来看

User [id=1, name=null, age=26, sex=男, date=Tue Jan 05 15:21:00 CST 2016]
我们看到首先id和age能够解析出来,其次age由26.5转换为了26。所以我们可以看出fastjson在反序列化时匹配的是字段名(name),只要字段名符合,就进行反序列化,如果类型不符合,则进行强制类型转换。





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