【Bug记录】JSON parse error: raw timestamp (1595952000000) not allowed for `java.time.LocalDateTime`

文章讲述了在处理使用LocalDateTime的Java实体类与JSON交互时遇到的问题,即POSTMAN发送的JSON自动转换为时间戳。为了解决这个问题,作者提供了一个配置,自定义了LocalDateTime的序列化和反序列化方式,确保在接收时能正确转换回LocalDateTime格式。
摘要由CSDN通过智能技术生成

实体类使用LocalDateTime,json格式使用postman测试传值时自动转换原始时间戳,后台需要LocalDateTime格式,故报错

解决:使用LocalDateTime的序列化配置,在接收之前再转换为LocalDateTime格式

package com.hmdp.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

@Configuration
public class LocalDateTimeSerializerConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return builder -> {
            builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer());
            builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer());
        };
    }

    /**
     * 序列化
     */
    public static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            if (value != null) {
                long timestamp = value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
                gen.writeNumber(timestamp);
            }
        }
    }

    /**
     * 反序列化
     */
    public static class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext)
                throws IOException {
            long timestamp = p.getValueAsLong();
            if (timestamp > 0) {
                return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
            } else {
                return null;
            }
        }
    }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String通常发生在将String类型的值转换为java.time.LocalDateTime类型的过程中。这个错误可能有以下几个原因: 1. 日期格式不匹配:如果传入的日期字符串的格式与期望的`java.time.LocalDateTime`类型的格式不匹配,就会出现这个错误。确保传入的日期字符串和期望的格式一致。 2. 日期字符串为空或无效:如果传入的日期字符串为空或无效,无法进行解析为`java.time.LocalDateTime`类型,就会出现这个错误。请检查传入的日期字符串是否正确。 3. 序列化和反序列化配置问题:如果你使用的是框架或库来进行JSON的序列化和反序列化操作,可能需要检查相关的配置是否正确。确保框架或库正确地处理`java.time.LocalDateTime`类型的序列化和反序列化操作。 要解决这个错误,你可以尝试以下几个方法: 1. 检查日期格式:确认传入的日期字符串的格式与期望的`java.time.LocalDateTime`类型的格式一致。可以参考中的错误信息和中的示例来确定正确的日期格式。 2. 验证日期字符串的有效性:确保传入的日期字符串不为空并且是一个有效的日期。可以使用相关的日期验证方法来检查日期字符串的有效性。 3. 检查序列化和反序列化配置:如果你使用框架或库来进行JSON的序列化和反序列化操作,检查相关的配置是否正确。确保框架或库正确地处理`java.time.LocalDateTime`类型的序列化和反序列化操作。 综上所述,当出现JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String错误时,你可以检查日期格式、验证日期字符串的有效性以及确认序列化和反序列化配置是否正确来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值