FastJson序列化時過濾欄位(屬性)的方法總結
阿新 • • 發佈:2020-08-18
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 }