1. 程式人生 > 實用技巧 >FastJson序列化時過濾欄位(屬性)的方法總結

FastJson序列化時過濾欄位(屬性)的方法總結

 FastJson序列化時(即轉成JSON字串時),可以過濾掉部分欄位,或者只保留部分欄位,方法有很多,下面舉一些常用的方法。

方法一、FastJson的註解

1     @JSONField(serialize = false)
2     private String name;

  最便捷,直接在實體的欄位上加FastJson的註解serialize = false,轉JSON字串時就不會有該欄位。

方法二、JAVA關鍵字

1     @JSONField(name = "AGE")
2     private transient String age;

  在實體欄位前面,使用transient關鍵字,表示該欄位不參與序列化,轉JSON字串時就可以忽略掉該欄位。因為是JAVA關鍵字所以也會影響該欄位其他序列化操作。

方法三、FastJson的屬性名過濾器

1     SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
2     filter.getExcludes().add("PHONE");
3     System.out.println(JSONObject.toJSONString(u, filter));

  通過SimplePropertyPreFilter過濾器,來過濾指定的屬性名,然後在轉JSON的時候,帶上過濾器引數即可。

  如果需要保留的引數比較少,也可以反過來,使用filter.getIncludes().add("PHONE");的方式來包含指定的欄位。還可以直接在new的時候帶上,這裡是可變引數,所以可以同時指定多個,即如下這種寫法:

1     SimplePropertyPreFilter filter = new SimplePropertyPreFilter("PHONE", "SEX");

注:這裡的欄位名為轉成JSON後的key,不是實體的屬性名。如例子中為大寫SEX,而不是小寫的sex。

方法四、FastJson的屬性過濾器

 1     PropertyFilter profilter = new PropertyFilter() {
 2         @Override
 3         public boolean apply(Object object, String name, Object value) {
 4             if (name.equals("SEX")) {
 5                 // false表示欄位將被排除在外
 6                 return false;
 7             }
 8             return true;
 9         }
10     };
11     System.out.println(JSON.toJSONString(u, profilter));

  通過實現PropertyFilter介面的apply方法,來實現過濾屬性,方法引數name即為欄位的key,引數value即為欄位的value,這種方式最強大,因為可以自定義具體過濾規則。方法返回false即為排除該欄位。在轉JSON的時候,帶上過濾器引數即可。注:引數name指的欄位名為轉成JSON後的key,不是實體的屬性名。如例子中為大寫SEX,而不是小寫的sex。

  如果是JAVA8的話。可以使用lambda表示式,更簡潔,如下:

1     PropertyFilter profilter = (object, name, value) -> {
2         if (name.equals("SEX")) {
3             // false表示欄位將被排除在外
4              return false;
5         }
6         return true;
7     };

附上實體類做參考:

 1         public class User {
 2 
 3         @JSONField(name = "ID")
 4         private String id;
 5 
 6         @JSONField(serialize = false)
 7         private String name;
 8 
 9         @JSONField(name = "AGE")
10         private transient String age;
11 
12         @JSONField(name = "SEX")
13         private String sex;
14 
15         @JSONField(name = "PHONE")
16         private String phone;
17         }