如何优雅解析JsonNode的fields数组内valid值 避免硬编码索引失效问题
优化方案
你现有代码的问题主要有三点:
- 硬编码取数组第0位元素,数组长度变化后逻辑直接失效
- 直接用
toString.contains做模糊匹配,容易出现误判,也无法精准提取valid字段的取值 - 链式调用
get没有做非空校验,当对应节点不存在时会直接抛出空指针异常
推荐实现方式
我们可以遍历整个fields数组,逐个解析键值对,匹配到valid键后直接返回对应的值,兼容任意长度的数组,同时增加全链路空校验避免异常:
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper} import scala.jdk.CollectionConverters._ val response = """{"myTable":{"fields":["valid:true","otherKey:false"]}}""" val mapper = new ObjectMapper() val node = mapper.readTree(response) val validResult = Option(node.get("myTable")) // 校验myTable节点下的fields字段存在且为数组类型 .flatMap(tableNode => Option(tableNode.get("fields"))) .filter(_.isArray) .map(fieldsNode => { // 遍历数组所有元素查找valid配置 fieldsNode.elements().asScala .map(_.asText("")) // 安全转字符串,空值默认返回空串 .filter(_.contains(":")) // 过滤不符合键值对格式的异常元素 .map(_.split(":", 2)) // 按第一个冒号拆分,避免值内包含冒号导致拆分错误 .find(_.head == "valid") // 匹配键为valid的项 .exists(_.last == "true") // 判断值是否为true }) .getOrElse(false) // 任意节点缺失的场景默认返回false,可按需调整默认值 println(s"valid=$validResult")
方案优势
- 兼容任意长度的
fields数组,不管valid的配置在数组第几位都能正确识别 - 拆分键值对精准匹配,避免模糊匹配带来的误判问题
- 全链路增加空校验,不会因为上游返回结构缺失抛出空指针异常
- 如果后续需要提取其他key的取值,只需复用相同的遍历逻辑即可
内容的提问来源于stack exchange,提问作者CoolGoose
相关产品推荐
相关产品推荐

