fastjson,一行代码实现自定义过滤某些属性,通用方法

最近几个项目都用的fastjson,前阵子遇到这个问题的时候我本觉得是很是简单,百度一下几秒钟的事。结果网上的答案是真TM的坑,要么文不对题,要么根本就是错的,并且还抄来抄去。坑了我几个小时。如今记下来一是之后忘了回来看下,二是让后来者少走弯路,但愿他们能早点看到这片文章把。java

那些坑人的垃圾文章有以下几个特征:json

  • 只能过滤某个属性,覆盖apply方法(说好的过滤某些呢?)
  • 上者的增强版,多个或条件(一点都不通用啊)
  • 其实是保留属性(反向操做?)
  • 循环remove(这么生硬?)
  • 不想要的字段上用注解@JSONFiled(serialize=false)(这个还算是靠谱的答案了,但有的团队要求model尽可能纯净不被注解侵入;或者是这个java bean是在别处定义的你没法接触到,就行不通。PS:此处不扯DTO、DO、VO、XXOO的问题)
  • 低版本

随便在网上搜搜看,不少文章都是这样并且高度类似的。我想要的是一个自由的、不依赖注解的、通用的、不侵入的、自定义的解决方案。方法以下:app

1. 先定义个bean:函数

public class Person implements Serializable{
    private static final long serialVersionUID = -2414273235642766924L;

    private String name;
    private String sex;
    private int age;
    private Person father;

    public Person() {
    }

    public Person(String name, String sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    //省略getter和setter
}

注意:序列化的bean类须要有默认的无参构造函数,不然fastjson在使用反射的时候会报错。this

2. 通用方法:code

private static JSON toJson(Object o, String... excludeKeys) {
    List<String> excludes = Arrays.asList(excludeKeys);
    SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
    filter.getExcludes().addAll(excludes);    //重点!!!
    return JSON.parseObject(JSON.toJSONString(o, filter));
}

String... 能够方便的自定义你想要过滤的属性对象

3. 示例:rem

public static void main(String[] args) {
    Person child = new Person("mike", "male", 10);
    Person father = new Person("jimmy", "male", 37);
    child.setFather(father);
    JSON json  = toJson(child, "name", "age");
    System.out.println(json);
}

4. 结果:get

{"father":{"sex":"male"},"sex":"male"}

能够看到成功过滤了某些属性,并且连引用对象的相关属性也过滤掉了,实现了深层过滤io

相关文章
相关标签/搜索