java list转JSONObject报错
最近的项目需要将 list 转 json 返回到页面显示,遇到问题:
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
at net.sf.json.JSONObject._fromBean(JSONObject.java:738)
at net.sf.json.JSONObject.fromObject(JSONObject.java:182)
at net.sf.json.JSONObject._processValue(JSONObject.java:2426)
at net.sf.json.JSONObject._setInternal(JSONObject.java:2447)
at net.sf.json.JSONObject.setValue(JSONObject.java:1189)
at net.sf.json.JSONObject._fromBean(JSONObject.java:725)
at net.sf.json.JSONObject.fromObject(JSONObject.java:182)
at net.sf.json.JSONArray._processValue(JSONArray.java:2294)
at net.sf.json.JSONArray.processValue(JSONArray.java:2325)
at net.sf.json.JSONArray.addValue(JSONArray.java:2312)
at net.sf.json.JSONArray._fromCollection(JSONArray.java:841)
at net.sf.json.JSONArray.fromObject(JSONArray.java:137)
at net.sf.json.JSONArray.fromObject(JSONArray.java:120)
谷歌了一下,据说是因为 list 中的数据有 java.sql.date 类型,而 json 的转换需要 java.util.date。所以转换会报错。如果 list 中数据有 java.sql.time 也会有同样的错。废话不多说,说下怎么解决。JSON jar 包提供了扩展 JSON 转换处理类的方法。扩展类需要实现 JsonValueProcessor,代码如下
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
public class JsonDateValueProcessor implements JsonValueProcessor {
private String format ="yyyy-MM-dd hh🇲🇲ss";
private String format2 ="hh🇲🇲ss";
public Object processArrayValue(Object value, JsonConfig config) {
return process(value);
}
public Object processObjectValue(String key, Object value, JsonConfig config) {
return process(value);
}
private Object process(Object value){
if(value instanceof Date){
SimpleDateFormat sdf = new SimpleDateFormat(format,Locale.UK);
return sdf.format(value);
}
if(value instanceof Time){
SimpleDateFormat sdf = new SimpleDateFormat(format2,Locale.UK);
return sdf.format(value);
}
return value == null ? "" : value.toString();
}
}
转换 JSON 的时候如下:
JSONObject jsonArray = new JSONObject();
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValueProcessor());
jsonConfig.registerJsonValueProcessor(java.sql.Time.class, new JsonDateValueProcessor());
JSONArray jsonObj = JSONArray.fromObject(userlist, jsonConfig);