在使用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屬性及集合對象