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

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

高老师2年前 (2023-12-28)JAVA297
最近对外部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.20230611.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睡眠方法,java睡眠函数,java睡眠时间,java睡眠一分钟,java睡眠五秒钟

java睡眠方法,java睡眠函数,java睡眠时间,java睡眠一分钟,java睡眠五秒钟

(1).java睡眠函数Thread.sleep(时间);  //单位为毫秒(2).java睡眠函数例子Date dNow = new Date(); SimpleDateFormat ft = new&nbs...

java正则表达式捕获组

java正则表达式捕获组

java正则表达式的捕获组捕获组可以将匹配到的结果根据正则中的括号进行分组,这里变量我加了$符,php转java的坏习惯,懒得改了,能跑就行// 匹配字符串 String $line = "gaojiufeng 1994! ok?...

java匹配一个字符串在另外一个字符串中出现的次数,java正则start,java正则end

java匹配一个字符串在另外一个字符串中出现的次数,java正则start,java正则end

java匹配一个字符串在另外一个字符串中出现的次数,java正则start,java正则end// 正则 String pattern = "\\bgao\\b"; // 字符串 String content ...

java正则appendReplacement方法和java正则appendTail

java正则appendReplacement方法和java正则appendTail

假如有个字符串为"fatcatfatcatfat",正则为“cat”当调用appendReplacement(sb, "dog")时appendReplacement方法都会把匹配到的内容替换为dog,并把匹配到字符串的前面几个字符串+dog送给sb里,所以第...

java从命令行读取字符输入

java从命令行读取字符输入

java从命令行读取字符输入java的控制台输入是由System.in提供的//11.1.每次读取1个字符// 创建bufferedReader BufferedReader br = new BufferedReader(new Inpu...