上一篇博客讲了,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());
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),只要字段名符合,就进行反序列化,如果类型不符合,则进行强制类型转换。