https://blog.youkuaiyun.com/u011113654/article/details/50460787
使用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));
- /**
- * @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 {}
- //
- 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));
- // 根据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));
- // 序列化时修改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));
- // 序列化时在最前添加内容
- BeforeFilter beforeFilter = new BeforeFilter() {
- @Override
- public void writeBefore(Object object) {
- writeKeyValue("start", "bofore");
- writeKeyValue("start1", "bofore");
- }
- };
- System.out.println("BeforeFilter : " + JSON.toJSONString(group, beforeFilter));
- // 序列化之时在最后添加内容
- AfterFilter afterFilter = new AfterFilter() {
- @Override
- public void writeAfter(Object object) {
- writeKeyValue("end", "after");
- }
- };
- System.out.println("AfterFilter : " + JSON.toJSONString(group, afterFilter));