JSONObject的過濾設定

老頭學程式設計發表於2020-12-17

在使用json-lib包中JSONObject.fromObject(bean,cfg)時,可能出現以下幾種情況:

1、(防止自包含)轉換的物件包含自身物件,或者物件A下面掛了物件B,物件B下面又掛了物件A,如果不設定取消環形結構,則那麼會拋異常:“There is a cycle in the hierarchy!”

解決方法:

在呼叫JSONObject.fromObject(bean,cfg)時,自定義JsonConfig:

JsonConfig cfg = new JsonConfig();
cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

然後將cfg物件傳入fromObject方法中,這樣,物件B下面掛的物件A就會被置為NULL。

2、(Date型別轉化)JavaBean出現Date格式時,轉化成json時會出現將其轉化為:{“date”:6,“day”:3,“hours”:21,“minutes”:26,“month”:0,“nanos”:290000000,“seconds”:31,“time”:1452086791290,“timezoneOffset”:-480,“year”:116},這個不易處理,如果需要將Date轉換為我們認識的“yyyy-MM-dd”格式,則需要自行建立時間轉換器,並實現json-lib中的JsonValueProcessor介面,實現該介面中的兩個方法(processArrayValue和processObjectValue):

1     public class JsonDateValueProcessor implements JsonValueProcessor {  
 2     private String format ="yyyy-MM-dd";  
 3       
 4     public JsonDateValueProcessor() {  
 5         super();  
 6     }  
 7       
 8     public JsonDateValueProcessor(String format) {  
 9         super();  
10         this.format = format;  
11     }  
12   
13     @Override  
14     public Object processArrayValue(Object paramObject,  
15             JsonConfig paramJsonConfig) {  
16         return process(paramObject);  
17     }  
18   
19     @Override  
20     public Object processObjectValue(String paramString, Object paramObject,  
21             JsonConfig paramJsonConfig) {  
22         return process(paramObject);  
23     }  
24       
25       
26     private Object process(Object value){  
27         if(value instanceof Date){    
28             SimpleDateFormat sdf = new SimpleDateFormat(format,Locale.CHINA);    
29             return sdf.format(value);  
30         }    
31         return value == null ? "" : value.toString();    
32     }  
33   
34 }  

cfg.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());

這樣,物件下面如果有Date型別,轉化出來變為“yyyy-MM-dd”格式。

3、(欄位過濾)如果需要在轉化過程中去除某些欄位,則需要定義一些Excludes欄位,具體使用如下:

  String[] EXCLUDES = new String[]{"A","B","C"};
  cfg.setExcludes(EXCLUDES);  

這樣,物件轉化時,“A”,“B”,"C"會被去除,物件中這些欄位轉成json時會被刪除。

4、(過濾器PropertyFilter使用)和3有點類似,但是PropertyFilter作用是為了過濾某些符合一些指定條件的屬性,如:

cfg.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object source, String name, Object value) {
return value == null;//value為null時返回true,返回true的就是需要過濾調的
}
});

這樣,物件轉化出來後,生成的 json 字串只包含非空的值。

5、其餘的常見用法:

  • cfg.setIgnoreDefaultExcludes(true); //預設為false,即過濾預設的key,改為true則不忽略
  • cfg.setJsonPropertyFilter(new IgnoreFieldProcessorImpl(true)); //
    忽略掉集合物件
  • cfg.setJsonPropertyFilter(new IgnoreFieldProcessorImpl(true, new
    String[]{“name”})); // 忽略掉name屬性及集合物件
  • 其他參考資料:https://www.cnblogs.com/benpaobawoniu/p/6607550.html
  • 寫的不錯程式碼:https://www.cnblogs.com/az19870227/archive/2011/09/19/2180993.html

相關文章