JsonConfig配置Clob
1.情景展示
项目使用的是Oracle数据库,并且表中的某些字段类型设置成了clob类型;
当我们从数据库读取数据的时候,需要单独对clob字段进行处理,否则返回的是内存地址。
2.具体分析
除了在ibatis和java当中进行数据转换外,我们也可以在即将返回给前端JSON数据前,完成数据的转换。
以net.sf.json为例进行举例说明
我们可以在调用JSONObject.fromObject(Object),将Object转换成JSON对象前,可以通过JsonConfig来自主定义:某些数据类型或对象,在转换成String时的转换规则。
3.解决方案
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
JsonConfig jsonConfig = new JsonConfig();
// Date:2022年8月13日11:57:58
// Author:Marydon
// Clob转换String(如果是Oracle的clob的话,数据类型必须使用这个,oracle.sql.CLOB.class,否则匹配失效)
jsonConfig.registerJsonValueProcessor(oracle.sql.CLOB.class, new JsonValueProcessor() {
@Override
public Object processArrayValue(Object arg0, JsonConfig arg1) {
return null;
}
@Override
public Object processObjectValue(String arg0, Object clob, JsonConfig arg2) {
String re = "";
Reader is = null;
BufferedReader br = null;
try {
// 得到流
is = ((oracle.sql.CLOB) clob).getCharacterStream();
br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
while (s != null) {
sb.append(s);
s = br.readLine();
}
re = sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return re;
}});
// 使用自定义的规则,将对象转成JSON对象
JSONObject js = JSONObject.fromObject(baseAction.getModel(), jsonConfig);
4.拓展
同样地,我们也可以把日期类型在返回给前端时,完成指定的转换。
jsonConfig.registerJsonValueProcessor(java.sql.Date.class, new JsonValueProcessor() {
@Override
public Object processArrayValue(Object value, JsonConfig jsonConfig)
{
String[] obj = {};
if (value != null)
{
if (value instanceof Date[])
{
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
Date[] dates = (Date[]) value;
obj = new String[dates.length];
for (int i = 0; i < dates.length; i++)
{
obj[i] = sf.format(dates[i]);
}
}
}
return obj;
}
@Override
public Object processObjectValue(String key, Object value, JsonConfig jsonConfig)
{
if (value != null)
{
if (value instanceof Date)
{
String str = new SimpleDateFormat("yyyy-MM-dd").format((Date) value);
return str;
}
}
return value;
}});
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/16587385.html