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;
}
}
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/18008621