toJSONString空值被忽略解决办法
原代码:
GcGarbageBuildingDO data = gcGarbageBuildingService.get(id);
result.putAll(JSON.parseObject(JSON.toJSONString(data), Map.class));
查询出来的data中部分字段值为null,在toJSONString的过程中会把null值过滤掉,最后导致转换后的数据中部分字段丢失了
data值:null还在
执行toJSONString后:null值全部被过滤掉了
解决办法:用 toJSONString(Object object, SerializerFeature... features)
GcGarbageBuildingDO data = gcGarbageBuildingService.get(id);
result.putAll(JSON.parseObject(JSON.toJSONString(data, SerializerFeature.WRITE_MAP_NULL_FEATURES), Map.class));
JSONString源码:
SerializerFeature属性:
名称 含义
QuoteFieldNames 输出key时是否使用双引号,默认为true
UseSingleQuotes 使用单引号而不是双引号,默认为false
WriteMapNullValue 是否输出值为null的字段,默认为false
WriteEnumUsingToString Enum输出name()或者original,默认为false
SortField 按字段名称排序后输出。默认为false
WriteTabAsSpecial 把\t做转义输出,默认为false
PrettyForma 结果是否格式化,默认为false
WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到
toJSONString过程中时间格式丢失问题解决办法
上面的转换解决后又碰到了另一个问题,实体类中有Date类型数据,原本已经使用了下面两个注解对时间进行格式化:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
但是在toJSONString的过程中,这个时间格式丢失了,返回的数据变成了时间戳以及fastime
解决办法:toJSONStringWithDateFormat(Object object, String dateFormat, SerializerFeature... features)
result.putAll(JSON.parseObject(JSON.toJSONStringWithDateFormat(data, "yyyy-MM-dd HH:mm:ss", SerializerFeature.WriteMapNullValue), Map.class));
toJSONStringWithDateFormat源代码:
结果如下:
其实还是有点问题,如果这个实体类里面有多种Date格式,就比如openStartHours这个属性,应该是HH:mm:ss格式,但这个方法好像只能使Date类型的属性共用一种时间格式,只能后续对值进行截取,要是有更好的解决办法欢迎指教。