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;
}});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值