当前位置: 首页 > 教程 > Fastjson >

Fastjson SerializeFilter

精华
小牛编辑
112浏览
2023-03-14

通过SerializeFilter可以使用扩展编程的方式实现定制序列化。Fastjson提供了多种SerializeFilter:

  • PropertyPreFilter:根据PropertyName判断是否序列化;
  • PropertyFilter:根据PropertyName和PropertyValue来判断是否序列化;
  • NameFilter:修改Key,如果需要修改Key,process返回值则可;
  • ValueFilter:修改Value;
  • BeforeFilter:序列化时在最前添加内容;
  • AfterFilter:序列化时在最后添加内容。

准备下面示例的实体类User:

package cn.xnip.domain;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class User {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}

1 PropertyFilter 根据PropertyName和PropertyValue判断是否序列化

1.1 PropertyFilter源码

public interface PropertyFilter extends SerializeFilter {
      boolean apply(Object object, String propertyName, Object propertyValue);
}

1.2 编写测试类

可以通过扩展实现根据Object或者属性名称或者属性值进行判断是否需要序列化。

package cn.xnip.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.PropertyFilter;
import cn.xnip.domain.User;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class MainApp {

    public static void main(String args[]){
        PropertyFilter filter = new PropertyFilter() {

            @Override
            public boolean apply(Object source, String name, Object value) {

                System.out.println("----------------source=" + source);
                System.out.println("----------------name=" + name);
                System.out.println("----------------value=" + value);
                System.out.println("");
                // 属性是id并且大于等于100时进行序列化
                if ("id".equals(name)) {
                    long id = ((Long) value).longValue();
                    return id >= 100;
                }
                return false;
            }
        };

        User user = new User();
        user.setId(1L);
        user.setName("eric");

        String jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("序列化,id=1:" + jsonString + "\n");

        user.setId(200L);
        jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("序列化,id=200:" + jsonString);
    }

}

1.3 运行结果

----------------source=User [id=1, name=eric]
----------------name=id
----------------value=1

----------------source=User [id=1, name=eric]
----------------name=name
----------------value=eric

序列化,id=1:{}

----------------source=User [id=200, name=eric]
----------------name=id
----------------value=200

----------------source=User [id=200, name=eric]
----------------name=name
----------------value=eric

序列化,id=200:{"id":200}

2 NameFilter 序列化时修改Key

2.1 NameFilter源码

public interface NameFilter extends SerializeFilter {
    String process(Object object, String propertyName, Object propertyValue);
}

2.2 编写测试类

如果需要,修改Key,process返回值则可

package cn.xnip.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.NameFilter;
import com.alibaba.fastjson.serializer.PascalNameFilter;
import cn.xnip.domain.User;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class MainApp {

    public static void main(String args[]){
        User user = new User();
        user.setId(9L);
        user.setName("eric");

        String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
        System.out.println("普通序列化:" + jsonString + "\n");

        NameFilter filter = new NameFilter() {

            @Override
            public String process(Object object, String name, Object value) {
                System.out.println("----------------object=" + object);
                System.out.println("----------------name=" + name);
                System.out.println("----------------value=" + value);
                System.out.println("");
                // 属性是id是修改id的名字
                if ("id".equals(name)) {
                    return name + "$";
                }
                return name;
            }
        };

        jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("NameFilter序列化:" + jsonString + "\n");

        // fastjson内置一个PascalNameFilter,用于输出将首字符大写的Pascal风格
        jsonString = JSON.toJSONString(user, new PascalNameFilter()); // 序列化的时候传入filter
        System.out.println("PascalNameFilter序列化:" + jsonString + "\n");
    }

}

2.3 运行结果

普通序列化:{"id":9,"name":"eric"}

----------------object=User [id=9, name=eric]
----------------name=id
----------------value=9

----------------object=User [id=9, name=eric]
----------------name=name
----------------value=eric

NameFilter序列化:{"id$":9,"name":"eric"}

PascalNameFilter序列化:{"Id":9,"Name":"eric"}

3 ValueFilter 序列化时修改Value

3.1 ValueFilter源码

public interface ValueFilter extends SerializeFilter {
      Object process(Object object, String propertyName, Object propertyValue);
}

3.2 编写测试类

如果需要,修改Value,process返回值则可

package cn.xnip.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.ValueFilter;
import cn.xnip.domain.User;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class MainApp {

    public static void main(String args[]){
        User user = new User();
        user.setId(9L);
        user.setName("eric");

        String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
        System.out.println("普通序列化:" + jsonString + "\n");

        ValueFilter filter = new ValueFilter() {

            @Override
            public Object process(Object object, String name, Object value) {
                System.out.println("----------------object=" + object);
                System.out.println("----------------name=" + name);
                System.out.println("----------------value=" + value);
                System.out.println("");
                // 属性是id时修改id的值
                if ("id".equals(name)) {
                    long id = ((Long) value).longValue();
                    return id + "$";
                }
                return value;
            }
        };

        jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("ValueFilter序列化:" + jsonString + "\n");
    }

}

3.3 运行结果

普通序列化:{"id":9,"name":"eric"}

----------------object=User [id=9, name=eric]
----------------name=id
----------------value=9

----------------object=User [id=9, name=eric]
----------------name=name
----------------value=eric

ValueFilter序列化:{"id":"9$","name":"eric"}

4 BeforeFilter 序列化时在最前添加内容

4.1 BeforeFilter源码

public abstract class BeforeFilter implements SerializeFilter {
      protected final void writeKeyValue(String key, Object value) { ... }
      // 需要实现的抽象方法,在实现中调用writeKeyValue添加内容
      public abstract void writeBefore(Object object);
}

4.2 编写测试类

在序列化对象的所有属性之前执行某些操作,例如调用 writeKeyValue 添加内容

package cn.xnip.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.BeforeFilter;
import cn.xnip.domain.User;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class MainApp {

    public static void main(String args[]){
        User user = new User();
        user.setId(9L);
        user.setName("eric");

        String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
        System.out.println("普通序列化:" + jsonString + "\n");

        BeforeFilter filter = new BeforeFilter() {

            @Override
            public void writeBefore(Object object) {

                System.out.println("----------------object=" + object);

                User user = (User) object;
                System.out.println("----------------User.id=" + user.getId() + " " + "User.name=" + user.getName() + "\n");
                user.setName(user.getName() + "$$$");
            }
        };

        jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("BeforeFilter序列化:" + jsonString + "\n");
    }

}

4.3 运行结果

普通序列化:{"id":9,"name":"eric"}

----------------object=User [id=9, name=eric]
----------------name=id
----------------value=9

----------------object=User [id=9, name=eric]
----------------name=name
----------------value=eric

ValueFilter序列化:{"id":"9$","name":"eric"}

5 AfterFilter 序列化时在最后添加内容

5.1 AfterFilter源码

public abstract class AfterFilter implements SerializeFilter {
      protected final void writeKeyValue(String key, Object value) { ... }
      // 需要实现的抽象方法,在实现中调用writeKeyValue添加内容
      public abstract void writeAfter(Object object);
}

5.2 编写测试类

在序列化对象的所有属性之后执行某些操作,例如调用 writeKeyValue 添加内容

package cn.xnip.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.AfterFilter;
import cn.xnip.domain.User;

/**
 * 小牛知识库网 - https://www.xnip.cn
 */
public class MainApp {

    public static void main(String args[]){
        User user = new User();
        user.setId(9L);
        user.setName("eric");

        String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
        System.out.println("普通序列化:" + jsonString + "\n");

        AfterFilter filter = new AfterFilter() {

            @Override
            public void writeAfter(Object object) {

                User user = (User) object;
                System.out.println("------------User.id=" + user.getId() + " " + "User.name=" + user.getName() + "\n");
                user.setName(user.getName() + "$$$");
            }
        };

        jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("AfterFilter序列化:" + jsonString + "\n");
        System.out.println(user);
    }

}

5.3 运行结果

普通序列化:{"id":9,"name":"eric"}

------------User.id=9 User.name=eric

AfterFilter序列化:{"id":9,"name":"eric"}