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

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2022-08-15 10:31  Marydon  阅读(466)  评论(0编辑  收藏  举报