一、异常
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
二、出现原因
两种情况:
1、使用JSONArray.fromObject(Object o)方法时,对象o中包含了Date类型的属性。
2、Web开发中,hibernate延时加载。
三、解决方案
两种解决方案:
1、放弃所有类型为Date的属性
JsonConfig cfg = JsonUtil.getCfgWithDis("addDate","updateDate");
System.out.println(JSONArray.fromObject(map,cfg).toString());
该方案得到的json串将不包含示例中的addDate、updateDate属性。
2、对对象o中的Date类型属性进行转化
JsonConfig cfg = JsonUtil.getCfgWithRemain("yyyy-MM-dd hh:mm:ss");
System.out.println(JSONArray.fromObject(map,cfg).toString());
其中,JsonUtil.java代码如下
package com.zzc.common;
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.util.PropertyFilter;
public class JsonUtil {
/**
* 保留类型为Date的属性
* @return JsonConfig
*/
public static JsonConfig getCfgWithRemain(String datePattern){
JsonConfig cfg = new JsonConfig();
cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
cfg.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(datePattern));
return cfg;
}
/**
* 放弃类型为Date的属性
* @return
*/
public static JsonConfig getCfgWithDis(final String...params){
JsonConfig cfg = new JsonConfig();
cfg.setJsonPropertyFilter(new PropertyFilter(){
public boolean apply(Object source, String name, Object value){
for(String str:params){
if(name.equals(str)){
return true;
}
}
return false;
}
});
cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
cfg.setIgnoreDefaultExcludes(false);
cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
return cfg;
}
}
class DateJsonValueProcessor implements JsonValueProcessor{
private String datePattern;
public DateJsonValueProcessor(String pattern){
this.datePattern = pattern;
}
@Override
public Object processArrayValue(Object arg0, JsonConfig arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object processObjectValue(String arg0, Object arg1,
JsonConfig arg2) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
return sdf.format(arg1);
}
}
希望对碰到此异常的童鞋有所帮助!