配置spring boot中的jackson序列化
在开发基于spring boot的应用程序时,jackson是默认的json序列化和反序列化工具。它提供了强大的功能,可以灵活地处理json数据。然而,jackson的默认行为可能无法完全满足我们的需求。例如,日期格式、空值处理、数据精度等问题可能需要自定义配置。本文将详细介绍如何在spring boot中配置jackson,以满足这些需求。
1. 为什么需要自定义jackson配置?
jackson的默认行为在大多数情况下是合理的,但在实际开发中,我们可能需要对以下方面进行自定义:
- 日期格式:默认情况下,jackson会将日期序列化为时间戳,这可能不符合我们的需求。
- 空值处理:默认情况下,jackson会忽略空值,但我们可能需要保留空值。
- 数据精度:对于
bigdecimal和biginteger等类型,直接序列化可能会导致精度问题。 - 自定义序列化:对于某些复杂类型,我们可能需要自定义序列化逻辑。
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序列化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论