使用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); } }
补充说明
- 该日期格式中第一个括号内的数字为UTC时间的毫秒级时间戳,Java
Date对象本身存储的就是UTC时间戳,因此直接使用该数值构造即可得到正确的时间点。 - 正则第二个分组匹配到的是时区偏移值,如果你业务需要按返回的时区转换为本地时间,可以额外解析该偏移量进行调整。
- 你的POJO类上的
@JsonFormat注解可保留也可删除,自定义反序列化器优先级更高,该注解不会生效。
内容的提问来源于stack exchange,提问作者Rosen Hristov
相关产品推荐
相关产品推荐

