当前位置: 代码网 > it编程>编程语言>Java > 如何配置Spring Boot中的Jackson序列化

如何配置Spring Boot中的Jackson序列化

2025年04月12日 Java 我要评论
配置spring boot中的jackson序列化在开发基于spring boot的应用程序时,jackson是默认的json序列化和反序列化工具。它提供了强大的功能,可以灵活地处理json数据。然而

配置spring boot中的jackson序列化

在开发基于spring boot的应用程序时,jackson是默认的json序列化和反序列化工具。它提供了强大的功能,可以灵活地处理json数据。然而,jackson的默认行为可能无法完全满足我们的需求。例如,日期格式、空值处理、数据精度等问题可能需要自定义配置。本文将详细介绍如何在spring boot中配置jackson,以满足这些需求。

1. 为什么需要自定义jackson配置?

jackson的默认行为在大多数情况下是合理的,但在实际开发中,我们可能需要对以下方面进行自定义:

  • 日期格式:默认情况下,jackson会将日期序列化为时间戳,这可能不符合我们的需求。
  • 空值处理:默认情况下,jackson会忽略空值,但我们可能需要保留空值。
  • 数据精度:对于bigdecimalbiginteger等类型,直接序列化可能会导致精度问题。
  • 自定义序列化:对于某些复杂类型,我们可能需要自定义序列化逻辑。

2. 配置jacksonconfig

在spring boot中,可以通过创建一个@configuration类并定义一个objectmapper的bean来自定义jackson的行为。

import com.fasterxml.jackson.annotation.jsonautodetect;
import com.fasterxml.jackson.annotation.jsoninclude;
import com.fasterxml.jackson.annotation.propertyaccessor;
import com.fasterxml.jackson.databind.deserializationfeature;
import com.fasterxml.jackson.databind.objectmapper;
import com.fasterxml.jackson.databind.serializationfeature;
import com.fasterxml.jackson.databind.module.simplemodule;
import com.fasterxml.jackson.databind.ser.std.tostringserializer;
import com.fasterxml.jackson.datatype.jsr310.javatimemodule;
import com.fasterxml.jackson.datatype.jsr310.deser.localdatedeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.localdatetimedeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.localtimedeserializer;
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 com.fasterxml.jackson.module.paramnames.parameternamesmodule;
import org.springframework.boot.autoconfigure.condition.conditionalonmissingbean;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation.primary;
import org.springframework.http.converter.json.jackson2objectmapperbuilder;
import java.math.bigdecimal;
import java.math.biginteger;
import java.time.localdate;
import java.time.localdatetime;
import java.time.localtime;
import java.time.format.datetimeformatter;
import java.util.timezone;
/**
 * @author xiaoxin
 */
@configuration
public class jacksonconfig {
    @bean
    @primary
    @conditionalonmissingbean(objectmapper.class)
    public objectmapper jacksonobjectmapper(jackson2objectmapperbuilder builder) {
        builder.simpledateformat("yyyy-mm-dd hh:mm:ss");
        objectmapper objectmapper = builder.createxmlmapper(false)
                .featurestodisable(serializationfeature.write_dates_as_timestamps)
                .featurestodisable(deserializationfeature.adjust_dates_to_context_time_zone)
                .timezone(timezone.gettimezone("asia/shanghai"))
                .build();
        // null数据返回
        objectmapper.setserializationinclusion(jsoninclude.include.always);
        objectmapper.setvisibility(propertyaccessor.all, jsonautodetect.visibility.any);
        // 反序列化时候遇到不匹配的属性并不抛出异常
        objectmapper.configure(deserializationfeature.fail_on_unknown_properties, false);
        // 序列化时候遇到空对象不抛出异常
        objectmapper.configure(serializationfeature.fail_on_empty_beans, false);
        // 反序列化的时候如果是无效子类型,不抛出异常
        objectmapper.configure(deserializationfeature.fail_on_invalid_subtype, false);
        // 不使用默认的datetime进行序列化,
        objectmapper.configure(serializationfeature.write_date_keys_as_timestamps, false);
        // 数据精度问题
        simplemodule simplemodule = new simplemodule()
                .addserializer(long.class, tostringserializer.instance)
                .addserializer(long.type, tostringserializer.instance)
                .addserializer(biginteger.class, tostringserializer.instance)
                .addserializer(bigdecimal.class, tostringserializer.instance);
        objectmapper.registermodule(simplemodule);
        // 配置java 8时间日期模块
        javatimemodule javatimemodule = new javatimemodule();
        javatimemodule.addserializer(localdatetime.class, new localdatetimeserializer(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss")));
        javatimemodule.addserializer(localdate.class, new localdateserializer(datetimeformatter.ofpattern("yyyy-mm-dd")));
        javatimemodule.addserializer(localtime.class, new localtimeserializer(datetimeformatter.ofpattern("hh:mm:ss")));
        javatimemodule.adddeserializer(localdatetime.class, new localdatetimedeserializer(datetimeformatter.ofpattern("yyyy-mm-dd hh:mm:ss")));
        javatimemodule.adddeserializer(localdate.class, new localdatedeserializer(datetimeformatter.ofpattern("yyyy-mm-dd")));
        javatimemodule.adddeserializer(localtime.class, new localtimedeserializer(datetimeformatter.ofpattern("hh:mm:ss")));
        objectmapper.registermodule(javatimemodule).registermodule(new parameternamesmodule());
        return objectmapper;
    }
}

到此这篇关于配置spring boot中的jackson序列化的文章就介绍到这了,更多相关spring boot jackson序列化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com