SpringBoot使用jackson自定义反序列化接收不同格式的日期

本文介绍了一种在SpringBoot中实现日期格式兼容解析的方法,通过自定义JsonDeserializer实现对不同格式日期字符串的反序列化处理,使得同一接口能够接受多种格式的日期输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

需求:SpringBoot接口兼容不同格式的日期。

实现方式:继承JsonDeserializer实现自定义的反序列化。

二、源码

DateDeSerializer
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j
public class DateDeSerializer extends JsonDeserializer {

    @Override
    public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        String text = jsonParser.getText();
        return DateUtil.parse(text.replaceAll("-", "/"), "yyyy/MM/dd");
    }
}
DemoDto
@Data
public class DemoDto {

    @ApiModelProperty(value = "日期1", example = "2021/12/17")
    @JsonDeserialize(using = DateDeSerializer.class)
    private Date date1;

    @JsonDeserialize(using = DateDeSerializer.class)
    @ApiModelProperty(value = "日期2", example = "2021-12-17")
    private Date date2;

}

Controller

    @RequestMapping(value = "dateDemo", method = RequestMethod.POST)
    @ApiOperation(value = "日期转换测试-反序列化")
    public Object dateDemo(@RequestBody DemoDto demoDto) {
        log.info(JSONUtil.toJsonStr(demoDto));
        return Result.success(demoDto);
    }

三、实现效果

请求参数

{
	"date1": "2021/12/17",
	"date2": "2021-12-17"
}

控制台输出

{"date2":1639670400000,"date1":1639670400000}

### Spring Boot中序列化与反序列化的功能及作用 在Spring Boot中,序列化(Serialization)和反序列化(Deserialization)是数据转换的核心机制。序列化是指将对象的状态信息转换为可以存储或传输的形式,而反序列化则是指将这些形式的数据重新转换为对象的过程。 #### 1. 序列化的作用 序列化的主要作用是将Java对象转换为字节流,以便能够将其保存到文件、数据库或者通过网络进行传输。这种机制确保了对象可以在不同的环境中被正确地恢复和使用[^2]。例如,在分布式系统中,当需要将对象从一个服务传递到另一个服务时,必须先将对象序列化为字节流。 #### 2. 反序列化的作用 反序列化的作用与序列化相反,它是将字节流重新转换为Java对象的过程。这一过程对于恢复对象状态至关重要,尤其是在跨进程通信或持久化存储的场景下。例如,当从文件或网络接收到序列化的数据时,反序列化可以将其还原为原始的对象结构[^2]。 #### 3. 自定义序列化与反序列化 在某些情况下,标准的序列化和反序列化可能无法满足特定需求。例如,某些字段可能需要特殊的处理逻辑,或者需要对JSON格式进行自定义映射。在这种情况下,可以通过实现`JsonSerializer`和`JsonDeserializer`类,并结合`@JsonComponent`注解来定义自定义的序列化和反序列化逻辑[^3]。这种方式允许开发者灵活地控制数据的转换过程。 #### 4. 默认的序列化与反序列化工具:Jackson Spring Boot默认使用Jackson库来处理JSON格式的序列化和反序列化操作。Jackson通过其模块化设计,允许开发者通过`Module`接口注册自定义的序列化器和反序列化器[^1]。此外,Jackson还提供了丰富的注解支持,例如`@JsonProperty`、`@JsonIgnore`等,用于简化序列化和反序列化的配置。 #### 5. `serialVersionUID`的作用 在Java的序列化机制中,`serialVersionUID`是一个非常重要的概念。它用于标识类的不同版本。如果类中没有显式定义`serialVersionUID`,JVM会根据类的结构自动生成一个值。只要类的结构没有发生实质性变化(如添加或删除字段),即使重新编译多次,生成的`serialVersionUID`也不会发生变化[^2]。这有助于确保在不同版本之间进行反序列化时的一致性。 ```java import java.io.Serializable; public class Example implements Serializable { private static final long serialVersionUID = 1L; private String name; public Example(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` ### 示例代码:自定义序列化与反序列化 以下是一个简单的示例,展示如何在Spring Boot中通过`@JsonComponent`实现自定义的序列化和反序列化逻辑。 ```java import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.boot.jackson.JsonComponent; import java.io.IOException; @JsonComponent public class CustomSerializer extends JsonSerializer<Example> { @Override public void serialize(Example value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); gen.writeStringField("customName", value.getName().toUpperCase()); gen.writeEndObject(); } } ``` ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.boot.jackson.JsonComponent; import java.io.IOException; @JsonComponent public class CustomDeserializer extends JsonDeserializer<Example> { @Override public Example deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { JsonNode node = p.getCodec().readTree(p); String name = node.get("customName").asText().toLowerCase(); return new Example(name); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值