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

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

高老师12个月前 (12-28)JAVA200
最近对外部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增强型for循环

java增强型for循环

Java5 引入了一种主要用于数组的增强型 for 循环,类似js中的for inpublic class Member {     public static void main(String[]&...

java String 类 ,java 字符串类,java创建字符串,java获取字符串长度,java连接字符串,java格式化字符串

java String 类 ,java 字符串类,java创建字符串,java获取字符串长度,java连接字符串,java格式化字符串

在java中字符串属于对象,刚开始我就疑惑为什么int char等类型都是小写,结果String是大写,java太反人类,后来才知道String是对象。(1).java创建字符串String text = "net"; String tex...

java stringBuffer,java stringBuffer反转字符串,java stringBuffer delete删除字符/移除字符,java stringBuffer在指定位置插入字符串,java stringBuffer替换指定位置的字符串,java stringBuffer获取指定索引的值

java stringBuffer,java stringBuffer反转字符串,java stringBuffer delete删除字符/移除字符,java stringBuffer在指定位置插入字符串,java stringBuffer替换指定位置的字符串,java stringBuffer获取指定索引的值

java stringBuffer(1).stringBuffer和stringBuilder区别stringBuffer是线程安全的,stringBuilder速度更快(2).简单的stringBuffer例子StringBuffer sBuffer = new&nb...

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

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

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

java正则表达式捕获组

java正则表达式捕获组

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