当前位置:首页 > JAVA > 正文内容

SpringBoot报错JSON parse error: Cannot deserialize value of type java.util.Date from String "2023-12-2

高老师9个月前 (12-28)JAVA187
最近对外部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" 分隔,时区偏移量前面需要加上正负号。举个日期格式栗子吧。
2023-12-28T00:59:59.000+080
那么问题来了,PHP如何生成JAVA常用的ISO 8601格式日期呢?嗯,帮你写好了。
echo date('Y-m-d\TH:i:s.vO',time())
那么问题来了,PHP那边不想改代码怎么搞啊?嗯,那就改JAVA代码呗,给java.util.Date字段添加@JsonFormat注解呗。
/** 销售日期 */
@ApiModelProperty(value = "销售日期")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private List<Date> saleDate
那么问题来了,我想要自定义格式来接收怎么搞啊?嗯,那就改JAVA代码呗,创建一个自定义的日期反序列化器,用来解析特定格式的日期字符串。首先,创建一个类实现JsonDeserializer接口并重写deserialize方法。例如:
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注解指定自定义的反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class YourEntity {
    @JsonDeserialize(using = CustomDateDeserializer.class)
    private Date saleDate;

    // 其他字段和方法...
}
嗯,收手吧,不想写代码了。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.5b1.cn/post/691.html

分享给朋友:

“SpringBoot报错JSON parse error: Cannot deserialize value of type java.util.Date from String "2023-12-2” 的相关文章

 java字节与字符的区别,字节与字的区别与联系

java字节与字符的区别,字节与字的区别与联系

字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文...

java限制1个方法同一时间只能被一个线程访问

java限制1个方法同一时间只能被一个线程访问

java限制1个方法同一时间只能被一个线程访问public synchronized void setOrderPay(){ }加上synchronized 修饰符即可...

java final 修饰符,java通过final修饰符创建常量,,java通过final修饰符声明方法不可被修改

java final 修饰符,java通过final修饰符创建常量,,java通过final修饰符声明方法不可被修改

(1).final 修饰符通常和 static 修饰符一起使用来创建类常量。(2).父类中的 final 方法可以被子类继承,但是不能被子类重写,声明 final 方法的主要目的是防止该方法的内容被修改。public class Member {   ...

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

java数组,java创建数组,java创建数组并赋值,java数组元素个数,java foreach 循环数组,java数组排序

(1).创建数组double[] myList = new double[size];  //推荐创建方式 double myList[] = new double[size];  ...

java日期和时间

java日期和时间

(1).java获取当前日期时间Date date = new Date();  System.out.println(date.toString());输出Fri Jul 02 10:29:55 CST 2021(2).java获取时间戳秒/毫秒D...

java正则表达式判断字符串是否包含,java判断字符串是否包含

java正则表达式判断字符串是否包含,java判断字符串是否包含

pattern表示正则表达式,接收正则表达式作为参数例子:String content = "my name is gaojiufeng"; String pattern = "....