开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

有人遇到过反序列化时分秒类型的字段吗

{ "name":"suny", "age":"12", "length":"12.4342", "time":"16:27:30Z", "scnf":"2018-01-12", "birthday":"2022-08-30T14:35:03Z" } image.png

展开
收起
游客6vdkhpqtie2h2 2022-10-01 10:32:27 4608 0
7 条回答
写回答
取消 提交回答
  • 时间日期的格式不对,可以修改timezone来进行调整

    2022-11-06 08:51:27
    赞同 展开评论 打赏
  • JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。 1.方法一:

    JavaScript 写法 image.png 调取方法(将Json序列化的时间由/Date(1294499956278+0800))转为字符串

    例如:ChangeDateFormat("//Date(1294499956278+0800)//");

    SpringBoot中时间转换和序列化及反序列化 在SpringBoot中:

    加注在类字段上的@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss"),只能作用与当前类的加注字段上,用于转换前端传来的字符串格式的字符串时间格式到某种时间类上。该注解也只能转换前端传来的非时间戳时间参数信息。

    加注在类字段上的@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8", shape = JsonFormat.Shape.STRING)注解,只能序列化和反序列化前端传来的非时间戳时间信息,在返回给前端json序列化和j解析前端传来的json数据反序列化成对象时起作用。

    显然,遇到其他情形,局限性就显现出来了,怎么办呢?

    嗯,办法还是有的,查看源码后,通过SpringBoot添加全局转换时间和序列化与反序列化的自定义配置,解决此问题。

    我们来分情况,从序列化反序列化、时间转换两方面来解决。

    2022-10-31 18:12:32
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    入参格式化(比如前端请求的时候传了一个json字符串,controller处使用实体类接收) 此时会发生一次json字符串的反序列化,如果碰巧json字符串中有时间字符串存在,那么在反序列化的时候可能会报错

    这时,就可以使用 Spring 的 @DateTimeFormat 注解格式化参数,来解决上述问题。 注意:在form-data时可以成功,但是在使用@RequestBody时就不行了

    import org.springframework.format.annotation.DateTimeFormat

    public class DateVo { @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date date;

    public void setDate(Date date){
        this.date = date;
    }
    public Date getDate(){
        return date;
    }
    

    }

    出/入参格式化(比如controller处返回给前端序列化对象的时候) 注意: jackson在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时。 @JsonFormat 注解不是 Spring 自带的注解,所以使用该注解前需要添加 jackson 相关的依赖包。当然,如果是 SpringBoot 项目就不需要自己手动添加依赖了,因为在 spring-boot-start-web 下已经包含了 jackson 相关依赖。

    @JsonFormat( pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8" ) private Date date; 1 2 3 4 5 如果感觉单个配置麻烦的话可以采用全局配置来实现 package com.xxx.xxx.xxx.config;

    import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

    import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;

    @Configuration public class MyLocalDateTimeConvertCustoms implements Jackson2ObjectMapperBuilderCustomizer {

    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.deserializerByType(
                LocalDateTime.class
                ,new LocalDateTimeDeserializer(
                        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                )
        );
    }
    

    }

    2022-10-27 12:15:38
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    重新设置下时间日期的格式,调用timezone函数

    2022-10-26 13:05:36
    赞同 展开评论 打赏
  • coder at work

    时间处理推荐使用时间戳、字符串进行序列化、反序列化,再转成内置的date、time等类型,少一堆数据类型转换以及由此引发的序列化、反序列化问题

    2022-10-25 10:45:19
    赞同 展开评论 打赏
  • 从事java行业8年至今,热爱技术,热爱以博文记录日常工作,csdn博主,座右铭是:让技术不再枯燥,让每一位技术人爱上技术

    我用你的代码同样的方式反序列化是正常的,应该是你的实体类Test00的问题,但是这里无法看到你的实体类,现在需要你自行看一下你实体类接收time字段的数据类型,我的执行结果 image.png 可以看到直接用JSONObject接收数据的话是没有问题的,那么问题就只能是在你的实体类中,对应的time字段数据类型不匹配,如果实在找不到问题也可以通过JSONObject取出所有属性值,然后在set回对象中,曲线救国,就是麻烦了点,不过也是可以解决问题的

    2022-10-24 18:38:13
    赞同 展开评论 打赏
  • 时间日期的格式不对,可以修改timezone来进行调整

    2022-10-24 14:51:21
    赞同 展开评论 打赏
滑动查看更多

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载