io.vertx.core.json嵌套JsonObject使用Stream API按二级key查找值失败
问题根因
你编写的代码仅能遍历io.vertx.core.json.JsonObject的一级键值对,而field5是嵌套在field4数组的子JsonObject内部的字段,不在第一层级,因此无法匹配到结果。
实现方案
基于Vert.x Json库的API配合Stream API,实现递归遍历所有嵌套JsonObject、JsonArray结构的搜索逻辑即可,代码如下:
import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; // 递归搜索指定key的工具方法 private Optional<Object> searchByKey(Object jsonNode, String targetKey) { // 处理JsonObject类型节点 if (jsonNode instanceof JsonObject jsonObj) { // 优先匹配当前层级的key Optional<Object> currentMatch = jsonObj.stream() .filter(entry -> Objects.equals(entry.getKey(), targetKey)) .map(Map.Entry::getValue) .findAny(); if (currentMatch.isPresent()) { return currentMatch; } // 递归遍历当前层级所有值的子节点 return jsonObj.stream() .map(Map.Entry::getValue) .flatMap(child -> searchByKey(child, targetKey).stream()) .findAny(); } // 处理JsonArray类型节点 if (jsonNode instanceof JsonArray jsonArr) { return jsonArr.stream() .flatMap(child -> searchByKey(child, targetKey).stream()) .findAny(); } // 普通值类型无子节点,匹配失败 return Optional.empty(); }
调用示例:
// myJsonObject为你存储嵌套结构的JsonObject实例 Optional<Object> field5Result = searchByKey(myJsonObject, "field5"); // 可按需要转换为对应类型 String field5Value = field5Result.map(Object::toString).orElse(null);
Java 8适配说明
如果使用Java 8不支持instanceof模式匹配,修改类型判断部分的代码即可:
// 替换JsonObject判断逻辑 if (jsonNode instanceof JsonObject) { JsonObject jsonObj = (JsonObject) jsonNode; // 其余逻辑和上述工具方法一致 } // 替换JsonArray判断逻辑 if (jsonNode instanceof JsonArray) { JsonArray jsonArr = (JsonArray) jsonNode; // 其余逻辑和上述工具方法一致 }
逻辑说明
- 优先匹配当前JsonObject层级的key,匹配成功直接返回结果,减少无效遍历
- 遇到JsonArray结构时自动遍历数组内所有元素递归搜索
- 全程使用Optional处理空值,避免空指针异常
- 完全基于Vert.x官方Json库实现,不需要引入第三方依赖
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

