jdk1.8+如何判断hashmap中的value是否为LocalDateTime类型,LocaDateTime转json问题

本文介绍了在Java 1.8+中如何判断HashMap中的value是否为LocalDateTime类型,并探讨了在序列化LocalDateTime为JSON时遇到的问题和解决方案。通过示例代码,展示了如何避免转换过程中的问题,确保数据能够正确存储和识别。
摘要由CSDN通过智能技术生成

jdk1.8+如何判断hashmap中的value是否为LocalDateTime类型

喜欢用jvm新特性的你一定知道since1.8的LocalDateTime相比于Date的各种好处(格式化时并发安全),但是当你尝试序列化LocalDateTime却不想为其指定对象,只希望使用json这种通用的信息传递格式传递LocalDateTime传递值时,你就会发现这个LocalDateTime怎么这么难转json。
在这里插入图片描述
从源码定义可以看出它是继承了序列化接口的,说明我们用对象接收,经过包装发送接收解析后它是能够被还原的,请注意这是建立在对象之上的。如果我们不使用对象接收和发送LocalDateTime类型的值。直接使用json做转换传输,比如使用jackson包的 objectMapper.writeValueAsString方法将其转化再读取出来的话会报错 Cannot construct instance of java.time.LocalDateTime

指定类型**ObjectWriter s = new ObjectMapper().writerFor(LocalDateTime.class);**和上边报的错误一致
在这里插入图片描述

然后我使用fastjson来读取jackson转化之后的json,结果如下
在这里插入图片描述
读取成功,虽然排序不同,但是结果一致。
那么这两个json包结合使用是可行的

然后我们来尝试map的转换
在这里插入图片描述
这个结果倒是能看 ,我们确实是可以以这种
{“dayOfWeek”:“SATURDAY”,“hour”:17,“month”:“APRIL”,“dayOfMonth”:4,“dayOfYear”:95,“year”:2020,“monthValue”:4,“nano”:928000000,“chronology”:{“calendarType”:“iso8601”,“id”:“ISO”},“minute”:24,“second”:20}
时间描述的形式传递和转换的,但是显然这种方式很坑!

就正常开发思路来讲,我们接收到时间类型的数据想要存储到任何数据库中时间的格式应该是如下的:
2020-04-04T17:27:16.649
这样的格式才能被数据库正常识别为date类型,从而正常存储。

那么我们传递时怎么把LocalDateTime转化成这种格式呢?
很简单,使用toString即可
在这里插入图片描述
emm,看起来很好解决是吧,那你看一个细节,我的Map泛型是<String,Object>,你觉得我的Object会只装一个LocalDateTime吗?答案当然是否定的,我还要装HashMap,还要放一个ArryList,还要·····,你能想到的我可能都会放,如果代码写成这样
在这里插入图片描述
你可能会问:确定要这样玩吗?hhhh测试代码别当真,造出来的数据格式和我在生产上见过的差不多。
不知道你发现图中的问题了没有 我hashmap toString之后,键值对中的 : 变成了 = 。= 号分割的键值对当然无法很容易的转化为hashmap,硬要通过string的方法转化那么时间复杂度可想而知,是那这样问题就来了,转换后的数据无法被识别为转换前的数据。这能愉快的玩耍吗?显然不能。
这时聪明的你可能会想到我只转化LocalDateTime,别的不用理会, 用 instanceOf判断一下,是LocalDateTime类型的就转换一下,如果有嵌套的collection,递归一下即可,我们来试试

在这里插入图片描述这样是可以的,代码如下

package starter;

import com.alibaba.fastjson.JSON;
import
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值