Java SpringBoot中判断JsonNode是否含指定数组及空指针异常解决
问题根因
当JSON中不存在siblings键时,Jackson的JsonNode.get("siblings")会返回null,你未做非空校验直接调用isArray()方法,就会触发NullPointerException。
修复后代码
private List<SiblingsGameDataResponse> extractSiblingList(JsonNode node) { List<SiblingsGameDataResponse> siblingList = new ArrayList<>(); // 先校验存在非空的siblings字段且为数组类型 if (node.hasNonNull("siblings") && node.get("siblings").isArray()) { ArrayNode siblingsArrayNode = (ArrayNode) node.get("siblings"); for (JsonNode item : siblingsArrayNode) { siblingList.add(new SiblingsGameDataResponse(asString(item, "gameId"))); } return siblingList; } return Collections.emptyList(); }
如果使用的Jackson版本低于2.5,不支持hasNonNull方法,可以替换为如下校验逻辑:
private List<SiblingsGameDataResponse> extractSiblingList(JsonNode node) { List<SiblingsGameDataResponse> siblingList = new ArrayList<>(); JsonNode siblings = node.get("siblings"); if (siblings != null && siblings.isArray()) { ArrayNode siblingsArrayNode = (ArrayNode) siblings; for (JsonNode item : siblingsArrayNode) { siblingList.add(new SiblingsGameDataResponse(asString(item, "gameId"))); } return siblingList; } return Collections.emptyList(); }
优化说明
- 新增非空前置校验,同时覆盖「siblings键不存在」、「siblings键值为null」两种异常场景,彻底避免空指针
- 移除无用的
ArrayNode提前初始化逻辑,只有确认是数组类型时才做类型转换,减少不必要的对象创建 - 把迭代器遍历改为更简洁的增强for遍历,
ArrayNode本身实现了Iterable<JsonNode>接口,可直接用增强for循环遍历
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

