JSONObject解析数据库Date类型报错问题
最近项目在写服务器后端查询空间数据的接口时,由于表结构不一致,直接写了一个通用函数用json储存数据库中查询的结果,然而今天前端查询一个表的时候无法查到相应的结果,查了一下代码发现爆了如下错误。
报错:
Caused by: java.lang.IllegalArgumentException
at java.sql.Date.getHours
原因是该表中存在Date类型的字段,由于java.util.Date 和 java.sql.Date的转换问题造成的。
解决方案:采用JsonConfig注册对应的Date类型java.sql.Date;
将ResultSet结果存入json,原代码如下:
public JSONArray resultSetToJson(ResultSet rs)
{
// json数组
JSONArray array = new JSONArray();
// 获取列数
ResultSetMetaData metaData = null;
try {
metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
// 遍历ResultSet中的每条数据
while (rs.next()) {
JSONObject jsonObj = new JSONObject();
// 遍历每一列
for (int i = 1; i <= columnCount; i++) {
String columnName = metaData.getColumnLabel(i);
Object value = rs.getObject(columnName);
jsonObj.put(columnName, value);
}
array.add(jsonObj);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return array;
}
为了解决上述问题,通过定义配置文件,并且注册时间类型:
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(java.sql.Date.class, new JsonValueProcessor() {
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Object processArrayValue(Object o, JsonConfig jsonConfig) {
return null;
}
@Override
public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) {
if (o != null) {
return simpleDateFormat.format(o);
} else {
return null;
}
}
});
将jsonConfig应用在JSONObject时候,需要用到JSONObject.fromObject()
,例如:
JSONObject js = JSONObject.fromObject(jsonStr,jsonConfig)
但是本例中是直接将ResultSet获取到的结果存入JSONObject,所以采用先将结果放入Map对象中,再放到json里面:
Map<String,Object> map = new HashMap<>();
map.put(columnName, value);
jsonObj.putAll(map,jsonConfig);
查到的结果如下:
改完收工!