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

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 com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;

import java.time.LocalDateTime;
import java.util.*;

/**
 * @ClassName jsonTest
 * @Description //TODO
 * @Author geyunpeng
 * @Date 2020/4/4 17:05
 * @Version 1.0
 **/
public class jsonTest {
    
    
    @SneakyThrows
    public static void main(String[] args) {
    
    
        LocalDateTime now = LocalDateTime.now();
        Map<String, Object> map = new HashMap<>();
        map.put("Time",now);
        map.put("List",new ArrayList(Arrays.asList(new HashMap(map),new HashMap(map),new HashMap(map),new HashMap(map))));
        map.put("HashMap",new HashMap(map));
        localDateTimeToString(map);
        String s = new ObjectMapper().writeValueAsString(map);
        System.out.println(s);
        JSONObject jsonObject = JSON.parseObject(s);
        System.out.println(jsonObject);
    }

    private static void localDateTimeToString(Map<String, Object> map) {
    
    
        map.forEach((k, v) -> {
    
    
            if (v instanceof Map) {
    
    
               localDateTimeToString((Map<String, Object>) v);
               return;
            }
            if (v instanceof List) {
    
    
                ((List) v).stream().filter(element -> element instanceof Map).forEach(element -> localDateTimeToString((Map<String, Object>) element));
                return;
            }
            if (v instanceof LocalDateTime) {
    
    
                System.out.println(k + v);
                map.replace(k, map.get(k).toString());
            }
        });
    }
}

如果直接是前端传过来的时间类型数据用 v instanceof LocalDateTime判断判断不出来的话,需要这么写

body.forEach((k, v) -> {
    
    
            if (v.getClass().getName().equals("org.joda.time.LocalDateTime")) {
    
    
                body.replace(k, body.get(k).toString());
            }
        });

经验交流到此结束,如有错误敬请高手指点

猜你喜欢

转载自blog.csdn.net/w4187402/article/details/105312773