fastjson自定义ValueFilter后 丢失value为null的属性
背景:
使用List<Map<String, Object>> 接收 mybatisplus自定义sql查询所有数据,在JSON序列化时,日期时间变成了number类型,以及BigDecimal前端接收时,精度丢失
所以自定义了ValueFilter将BigDecimal转为字符串避免精度丢失,自定义方法将 TIMESTAMP(oracle.sql.TIMESTAMP)类型格式化为yyyy-MM-dd HH:mm:ss日期字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 | // 自定义 ValueFilter 来确保日期字符串不被重新解析为数值 ValueFilter dateFilter = new ValueFilter() { @Override public Object process(Object object, String name, Object value) { if (value instanceof TIMESTAMP) { return value; } if (name.equals( "ID" ) && value instanceof Number) { // 避免精度丢失 return value.toString(); } return value; } }; |
public static List<Map<String, Object>> formatTimestampsInList(List<Map<String, Object>> records) throws SQLException {
// 定义日期格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (Map<String, Object> record : records) {
// 处理TIMESTAMP类型数据
// 遍历记录中的所有键值对
for (String key : record.keySet()) {
Object value = record.get(key);
// 检查值是否为 Timestamp 类型
if (value instanceof TIMESTAMP) {
TIMESTAMP oracleTimestamp = (TIMESTAMP) value;
LocalDateTime localDateTime = oracleTimestamp.timestampValue().toLocalDateTime();
String formattedDate = localDateTime.format(formatter);
record.put(key, formattedDate);
}
}
}
// 返回修改后的页面对象
return records;
}
@Select("select * from ${tableName} ${condition} ")
List<Map<String, Object>> queryAllDataByTName(
@Param("tableName") String tableName,
@Param("condition") String condition
);
List<Map<String, Object>> res = mapper.queryAllDataByTName(tName , String.valueOf(setValues));
String json = JSON.toJSONString(formatTimestampsInList(res), dateFilter, SerializerFeature.WriteDateUseDateFormat);
JSONArray arrays = JSONObject.parseArray(json);
问题:
经过测试,当入参Object的value为null时,整个字段会丢失,PS:Null数据被FastJSON默认忽略了。
修复方法:
追加 SerializerFeature.WriteMapNullValue 即可
String json = JSON.toJSONString(formatTimestampsInList(res), dateFilter, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析