Jackson序列化clob数据

1.情景展示

在java当中,有时候我们不得不用jdbc来读取数据库数据,而不是通过mybatis框架。

这样就遇到一个问题:

如果表字段的数据类型为clob时,使用springboot默认进行序列化时,会报错。

如何解决?

2.具体分析

在springboot中,其默认的序列化类时Jackson。

既然Jackson的默认序列化规则不支持clob,那我们就需要自定义其序列化规则了。

3.解决方案

自定义序列化规则

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.sql.Clob;
import java.sql.SQLException;
/**
 * clob转String
 * @description: 自定义CLOB类型序列化规则
 * @author: Marydon
 * @date: 2024-02-05 16:01
 * @version: 1.0
 * @email: marydon20170307@163.com
 */
public class CLOBSerializer extends JsonSerializer<Clob> {
    @Override
    public void serialize(Clob value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value != null) {
            try {
                gen.writeString(value.getSubString(1, (int) value.length()));
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        } else {
            gen.writeNull(); // 如果值为 null,则写入 null
        }
    }
}

调用

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.sql.Clob;
public static String convertClobToStr(Object bean) {
    if (null == bean) return "";

    String jsonStr;
    try {
        ObjectMapper mapper = new ObjectMapper();
        //
        SimpleModule module = new SimpleModule();
        module.addSerializer(Clob.class, new CLOBSerializer()); // 注册自定义的序列化器
        mapper.registerModule(module); // 注册模块到 ObjectMapper 中

        // mapper.enable(SerializationFeature.INDENT_OUTPUT); // 可选:美化输出格式
        jsonStr = mapper.writeValueAsString(bean);
    } catch (JsonProcessingException e) {
        log.error("JavaBean-->json字符串转换失败:" + e.getMessage());
        return "";
    }

    return jsonStr;
}

4.拓展

除了需要处理clob类型外,我们还要处理日期类型。


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.extern.slf4j.Slf4j;

import java.sql.Clob;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * json工具类
 * @description:
 * @author: Marydon
 * @date: 2024-01-31 10:33
 * @version: 1.0
 * @email: marydon20170307@163.com
 */
@Slf4j
public class JSONUtils {

    /**
     * 将日期类型转换成String,并格式化(转成时间字符串)
     * 将Clob类型转换成String
     * java.time.LocalDateTime-->yyyy-MM-dd HH:mm:ss
     * java.time.LocalDate-->yyyy-MM-dd
     * java.time.LocalTime-->HH:mm:ss
     * java.util.Date-->yyyy-MM-dd HH:mm:ss
     * java.sql.Timestamp-->yyyy-MM-dd HH:mm:ss
     * java.sql.Clob-->java.lang.String
     * @description: 通过Jackson实现
     * @attention: 如果自定义key名称的话,通过添加注解@JsonProperty来实现
     * @date: 2024/1/31 10:58
     * @param: bean java类对象
     * @return: java.lang.String json字符串
     */
    public static String toString(Object bean) {
        if (null == bean) return "";

        String jsonStr;
        try {
            ObjectMapper mapper = new ObjectMapper();
            // 初始化JavaTimeModule
            JavaTimeModule timeModule = new JavaTimeModule();
            // 设置LocalDateTime的序列化格式
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
            // 设置LocalDate的序列化格式
            dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(dateTimeFormatter));
            // 设置LocalTime的序列化格式
            dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
            timeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(dateTimeFormatter));
            // 设置Date的序列化格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            timeModule.addSerializer(Date.class, new DateSerializer(false, sdf));
            // 设置Timestamp的序列化格式
            timeModule.addSerializer(Timestamp.class, new DateSerializer(false, sdf));
            mapper.registerModule(timeModule);

            // 处理Clob类型
            SimpleModule module = new SimpleModule();
            module.addSerializer(Clob.class, new CLOBSerializer()); // 注册自定义的序列化器
            mapper.registerModule(module); // 注册模块到 ObjectMapper 中

            // mapper.enable(SerializationFeature.INDENT_OUTPUT); // 可选:美化输出格式
            jsonStr = mapper.writeValueAsString(bean);
        } catch (JsonProcessingException e) {
            log.error("JavaBean-->json字符串转换失败:" + e.getMessage());
            return "";
        }

        return jsonStr;
    }
    
}

 

写在最后

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

 相关推荐:

posted @ 2024-02-05 18:19  Marydon  阅读(292)  评论(0编辑  收藏  举报