{ "name":"suny", "age":"12", "length":"12.4342", "time":"16:27:30Z", "scnf":"2018-01-12", "birthday":"2022-08-30T14:35:03Z" }
JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。 1.方法一:
JavaScript 写法 调取方法(将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添加全局转换时间和序列化与反序列化的自定义配置,解决此问题。
我们来分情况,从序列化反序列化、时间转换两方面来解决。
入参格式化(比如前端请求的时候传了一个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")
)
);
}
}
时间处理推荐使用时间戳、字符串进行序列化、反序列化,再转成内置的date、time等类型,少一堆数据类型转换以及由此引发的序列化、反序列化问题
我用你的代码同样的方式反序列化是正常的,应该是你的实体类Test00的问题,但是这里无法看到你的实体类,现在需要你自行看一下你实体类接收time字段的数据类型,我的执行结果 可以看到直接用JSONObject接收数据的话是没有问题的,那么问题就只能是在你的实体类中,对应的time字段数据类型不匹配,如果实在找不到问题也可以通过JSONObject取出所有属性值,然后在set回对象中,曲线救国,就是麻烦了点,不过也是可以解决问题的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。