如何使用Jackson库在反序列化前检查JSON是否为null或空
Jackson 反序列化前JSON有效性校验实现方案
核心校验逻辑
需要覆盖三类会导致反序列化后程序崩溃的无效场景:
- 目标JSON文件不存在、文件内容为空
- 读取到的内容是全空白字符、JSON字面量
null - JSON格式损坏、结构不合法,无法被正常解析
对应代码实现
直接将校验逻辑插入你标注的待补全位置即可,全局复用Jackson的ObjectMapper实例(该类线程安全,无需重复创建):
// 全局定义可复用的Jackson核心解析对象,线程安全 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); // 你的原有业务代码 HashMap<String, Administrador> administradores = new HashMap<>(); File targetJsonFile = new File(Archivos.ADMINISTRADORESALL.getPath()); boolean validJsonFlag = false; // 执行前置校验 if (targetJsonFile.exists() && targetJsonFile.length() > 0) { try (InputStream inputStream = new FileInputStream(targetJsonFile)) { // 先读取JSON树结构,不直接转换目标对象,提前校验格式 JsonNode rootNode = OBJECT_MAPPER.readTree(inputStream); // 排除JSON null、空节点场景,可根据业务调整判断规则 validJsonFlag = !rootNode.isNull() && !rootNode.isEmpty(); } catch (IOException e) { // 捕获解析异常,说明JSON格式损坏,标记为无效 validJsonFlag = false; } } // 仅校验通过时执行反序列化,否则保留初始化的空HashMap避免空指针 if (validJsonFlag) { administradores = Persistencia.DEserializeHashMap( Archivos.ADMINISTRADORESALL.getPath(), String.class, Administrador.class ); }
优化建议
- 如果你的
Persistencia.DEserializeHashMap方法内部也是基于Jackson实现反序列化,可以把上述校验逻辑直接整合到该工具方法内部,避免重复读取文件流产生额外IO开销,遇到无效JSON时直接返回空HashMap即可,所有调用该方法的地方无需重复写校验逻辑。 - 如果业务逻辑允许反序列化得到空HashMap,可以去掉
!rootNode.isEmpty()判断,仅保留非null和格式合法性校验即可。
内容的提问来源于stack exchange,提问作者santurron
相关产品推荐
相关产品推荐

