You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:45:38