首页 > 其他分享 >Jackson序列化clob数据

Jackson序列化clob数据

时间:2024-02-05 18:33:57浏览次数:22  
标签:Jackson clob java jackson new import 序列化 com

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: [email protected]
 */
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: [email protected]
 */
@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;
    }
    
}

 

写在最后

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

 相关推荐:

标签:Jackson,clob,java,jackson,new,import,序列化,com
From: https://www.cnblogs.com/Marydon20170307/p/18008621

相关文章

  • Jackson基本使用教程
    目录如何将一个Json序列化对象封装成为一个Pojo是实体类对象如何进行序列化与反序列化如何将数据进行绑定如何进行泛型数据绑定如何使用Jackson树模型(将复杂Json手动映射到类型)使用Jackson进行流式处理如何将一个Json序列化对象封装成为一个Pojo是实体类对象publicstaticvoi......
  • net8 对接webapi接口通过 GetFromJsonAsAsyncEnumerable方法直接得到对象,无需进行反序
    调用API直接获取到对象现在有一个接口返回如下图中的数据:如果是在8以前的版本中获取该接口的数据,需要先获取到接口内容,然后进行反序列化,代码如下conststringRequestUri="http://localhost:5145/user";usingvarclient=newHttpClient();varstream=awaitclient......
  • 每日一道面试题:Java中序列化与反序列化
    写在开头哈喽大家好,在高铁上码字的感觉是真不爽啊,小桌板又拥挤,旁边的小朋友也比较的吵闹,影响思绪,但这丝毫不影响咱学习的劲头!哈哈哈,在这喧哗的车厢中,思考着这样的一个问题,Java中的对象是如何在各个方法,或者网络中流转的呢?通过这个问题便引出了我们今天的主人公:序列化与反序列化!......
  • C#对象二进制序列化优化:位域技术实现极限压缩
    目录1.引言2.优化过程2.1.进程对象定义与初步分析2.2.排除Json序列化2.3.使用BinaryWriter进行二进制序列化2.4.数据类型调整2.5.再次数据类型调整与位域优化3.优化效果与总结1.引言在操作系统中,进程信息对于系统监控和性能分析至关重要。假设我们需要开发一个监控程序,该......
  • MFC 文件 File 序列化和反序列化
    //写文件voidCMainFrame::OnCarchiveWrite(){ //TODO:在此添加命令处理程序代码 /* a)创建文件对象CFile b)以写方式打开文件CFile::Open c)创建序列化对象,并且和文件关联在一起CArchive CArchive::store把数据保存到归档文件中。允许CFile写操作。 d)......
  • php session反序列化
    关于SessionSession,在汉语中表示通话、会话、对话(期)、话路[对谈时间]的意思,其本来的含义一个终端用户与交互系统进行通信的时间(间隔),通常是指从注册(进入系统)到注销(退出系统)之间所经过的时间。比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个Session......
  • 深度解析Java8社招面试题:Lambda序列化到底行不行?
    大家好,我是小米,一个热爱技术分享的小伙伴。今天,我们来聊一个关于Java8的话题,一个颇具技术深度的问题:“社招面试题:Java8中的Lambda表达式可以序列化吗?”废话不多说,让我们一起揭开这个技术的神秘面纱!Lambda表达式的崛起在Java8之前,我们编写代码时常常要依赖匿名内部类,这使得代码显得......
  • C#对象二进制序列化优化:从位域技术优化压缩数据大小
    目录1.引言2.优化过程2.1.进程对象定义与初步分析2.2.排除Json序列化2.3.使用BinaryWriter进行二进制序列化2.4.数据类型调整2.5.再次数据类型调整与位域优化3.优化效果与总结 1.引言在操作系统中,进程信息对于系统监控和性能分析至关重要。假设我们......
  • C# Json序列化方案选择
    在C#中,进行JSON序列化和反序列化有多种方案可供选择,常用的是下面俩个System.Text.Json:这是.NETCore和.NET5中内置的JSON序列化和反序列化库,提供了高性能和低内存消耗的JSON处理能力。Newtonsoft.Json:这是一个流行的第三方JSON处理库,广泛用于Framework中的JSON序列化和反序列化......
  • 25从零开始用Rust编写nginx,序列化之serde是如何工作的
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy序......