SpringBoot报错JSON parse error: Cannot deserialize value of type java.util.Date fr

2023-12-28 10:15:08 浏览数 (1)

最近对外部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;

    // 其他字段和方法...
}

嗯,收手吧,不想写代码了。

0 人点赞