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

相關文章
相關標籤/搜索