You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jackson @JsonFormat适配问题:如何解析无引号数字格式日期?

解决数字格式日期的Jackson解析问题

方法一:自定义日期反序列化器

编写自定义JsonDeserializer处理数字转日期的逻辑,通过注解绑定到目标字段:

  1. 实现自定义反序列化器:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class NumericDateDeserializer extends JsonDeserializer<Date> {
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");

    @Override
    public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        // 将数字值转为字符串格式的日期
        String dateStr = String.valueOf(parser.getLongValue());
        try {
            return DATE_FORMAT.parse(dateStr);
        } catch (ParseException e) {
            throw new IOException("解析数字日期失败: " + dateStr, e);
        }
    }
}
  1. 修改POJO绑定反序列化器:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Test {
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = NumericDateDeserializer.class)
    private Date date;

    // 添加上getter、setter方法
    public Date getDate() { return date; }
    public void setDate(Date date) { this.date = date; }
}

方法二:全局配置反序列化规则(多类通用场景)

如果多个POJO都存在这类数字日期字段,可以全局配置ObjectMapper,统一处理该格式:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class JacksonConfig {
    public static ObjectMapper getConfiguredMapper() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Date.class, new NumericDateDeserializer());
        mapper.registerModule(module);
        return mapper;
    }
}

使用配置后的ObjectMapper解析JSON:

String json = "{\"date\": 20221201}";
Test test = JacksonConfig.getConfiguredMapper().readValue(json, Test.class);

补充说明

  • 原解析得到1970-01-01的原因:Jackson默认将数字类型的日期值识别为毫秒级时间戳,20221201对应的时间戳远小于1970年的基准时间,因此显示为1970年初的日期。
  • 自定义反序列化器需处理ParseException,避免解析异常未被捕获。
  • 若使用Spring Boot,可通过Jackson2ObjectMapperBuilder注入全局反序列化规则,无需手动创建ObjectMapper。

内容的提问来源于stack exchange,提问作者Desolation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:20:44