最近对外部PHP提供一个查单接口,PHP传入的日期格式为:Y-m-d H:i:s ,如2023-12-28 09:50:59,SpringBoot中使用Date类型接收,接收失败,报错JSON parse error: Cannot deserialize value of type java.util.Date from String "2023-12-21 00:00:00": not a valid representation
在 Spring Boot 中,默认使用 Jackson 作为 JSON 序列化和反序列化的库。对于日期的序列化和反序列化,默认情况下,Spring Boot 使用 ISO-8601 格式进行转换。
ISO 8601 格式的日期和时间表示方法包括:
年份:YYYY(例如 2023)
月份:MM(例如 12)
日:DD(例如 21)
时间:THH:mm:ss.sss(例如 00:00:00.000)
时区:±hhmm 或 ±hh:mm(例如 0800)
在这种格式中,日期和时间之间使用大写字母 "T" 分隔,时区偏移量前面需要加上正负号。举个日期格式栗子吧。
代码语言:javascript复制2023-12-28T00:59:59.000 080
那么问题来了,PHP如何生成JAVA常用的ISO 8601格式日期呢?嗯,帮你写好了。
代码语言:javascript复制echo date('Y-m-dTH:i:s.vO',time())
那么问题来了,PHP那边不想改代码怎么搞啊?嗯,那就改JAVA代码呗,给java.util.Date字段添加@JsonFormat注解呗。
代码语言:javascript复制/** 销售日期 */
@ApiModelProperty(value = "销售日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private List<Date> saleDate
那么问题来了,我想要自定义格式来接收怎么搞啊?嗯,那就改JAVA代码呗,创建一个自定义的日期反序列化器,用来解析特定格式的日期字符串。首先,创建一个类实现JsonDeserializer接口并重写deserialize方法。例如:
代码语言:javascript复制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 CustomDateDeserializer extends JsonDeserializer<Date> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String date = jsonParser.getText();
try {
return dateFormat.parse(date);
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format, please use yyyy-MM-dd HH:mm:ss");
}
}
然后,在实体类的日期字段上使用@JsonDeserialize注解指定自定义的反序列化器:
代码语言:javascript复制import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
public class YourEntity {
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date saleDate;
// 其他字段和方法...
}
嗯,收手吧,不想写代码了。