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

使用Jackson反序列化JSON时如何将/Date(时间戳+时区)/格式串解析为java.util.Date

错误原因

你当前使用的日期解析模式与接口返回的.NET 微软JSON日期格式完全不匹配,你的SimpleDateFormat配置的是yyyy-MM-dd HH:mm:ss zzz格式,但接口返回的是/Date(毫秒时间戳+时区偏移)/的特殊格式,因此触发解析失败异常。

解决方案

修改自定义的DateDeserializer反序列化器,通过正则提取字符串中的毫秒时间戳直接构造Date对象即可,修改后的代码如下:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@SuppressWarnings("serial")
public class DateDeserializer extends JsonDeserializer<Date> {
    // 匹配微软日期格式的正则表达式
    private static final Pattern MS_DATE_PATTERN = Pattern.compile("/Date\\((\\d+)([+-]\\d{4})\\)/");

    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
        String dateStr = jsonParser.getText().trim();
        Matcher matcher = MS_DATE_PATTERN.matcher(dateStr);
        if (!matcher.matches()) {
            throw new IOException("不支持的日期格式: " + dateStr);
        }
        // 提取毫秒级时间戳,直接构造Date对象
        long timestamp = Long.parseLong(matcher.group(1));
        return new Date(timestamp);
    }
}
补充说明
  1. 该日期格式中第一个括号内的数字为UTC时间的毫秒级时间戳,Java Date对象本身存储的就是UTC时间戳,因此直接使用该数值构造即可得到正确的时间点。
  2. 正则第二个分组匹配到的是时区偏移值,如果你业务需要按返回的时区转换为本地时间,可以额外解析该偏移量进行调整。
  3. 你的POJO类上的@JsonFormat注解可保留也可删除,自定义反序列化器优先级更高,该注解不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:54:03