最近改项目遇到了一些小问题,特此记录。
问题一:Map转Json报空
报错如下:
2023-04-10 23:40:00.129 WARN 12584 --- [nio-8010-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: com.example.stu.utils.ResultUtil["data"]->java.util.HashMap["null"])]
意思是传回来的map的key是null,不能转为json。再看最后打印出来的查询结果如下:
ResultUtil(path=null, code=200, msg=获取单个用户成功, data={null={stu_id=1, password=123456, major=sw, create_time=2023-04-07 18:11:50, school=scsf, sname=lili, sex=女, sage=18, stu_class=2, card_id=502031425608093546, status=true}})
map的key值确实为null,解决方案是要么重新给一个key去掉null,要么重新序列化。然后我将这个map放进了list里面,打印结果如下:
ResultUtil(path=null, code=200, msg=获取单个用户成功, data=[{stu_id=1, password=123456, major=sw, create_time=2023-04-07 18:11:50, school=scsf, sname=lili, sex=女, sage=18, stu_class=2, card_id=502031425608093546, status=true}])
这样看来没有了null,但不能满足前端队友的需求,最后我引入了fastjson进行序列化将返回值转化为json(如果Fastjson引入失败看这篇文章:程序包com.alibaba.Fastjson不存在),问题解决。
问题二:Date类型转String类型
序列化问题解决了,但返回的数据中有一个Date类型的时间字段显示为一段长数字如4373842925341。
原因是因为json不能存储Date对象,必须将Date转换为String,再转换为Date。于是我先获取到该字段的值,然后用时间转换将Date转换为String,最后该字段重新赋值给map中对应的key并序列化返回:
//时间转换:将Date转换为String
SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(time));
问题解决。
待解决内容
- Map、List和Set三者各自的区别、应用场景及深入理解
- 为什么用Fastjson?
- 什么是序列化,为什么要用序列化?
- JSON.parse 和 JSON.stringify的区别
- JSON.toJSONString与toString、String.valueOf的区别