
本文介绍如何利用 Josson 库替代 Jayway JsonPath,在查询 JSON 时不仅获取匹配值,还能自动构建每个结果对应的精确 JsonPath 表达式(如 $.people[0].research[1].years[0].year),适用于需路径反馈的交互式 JSON 浏览器开发。
本文介绍如何利用 josson 库替代 jayway jsonpath,在查询 json 时不仅获取匹配值,还能自动构建每个结果对应的精确 jsonpath 表达式(如 `$.people[0].research[1].years[0].year`),适用于需路径反馈的交互式 json 浏览器开发。
Jayway JsonPath 是 Java 生态中广泛使用的 JSON 查询库,但其核心设计聚焦于值提取,不原生支持返回匹配节点的完整路径信息。当开发者需要为 UI 提供“点击值即定位到源路径”的能力(例如 JSON 调试器、数据探查工具)时,仅靠 JsonPath.read() 返回的扁平化结果列表(如 List<Integer>)无法满足需求——因为索引信息在遍历过程中已丢失。
此时,推荐采用 Josson(GitHub 地址)作为增强型解决方案。Josson 基于 Jackson 构建,专为 JSON 转换与路径感知操作而优化,其 map() + flatten() 组合可精准保留层级结构与数组索引,自动生成带位置标识的键名。
以下是一个完整示例,实现从嵌套 JSON 中提取所有 year 值并同步生成其完整 JsonPath:
import com.octomix.josson.Josson;
import com.fasterxml.jackson.databind.JsonNode;
public class JsonPathWithIndex {
public static void main(String[] args) {
String json = "{\n" +
" \"people\": [\n" +
" {\n" +
" \"id\": 1,\n" +
" \"fname\": \"Henry\",\n" +
" \"lname\": \"Cavendish\",\n" +
" \"profession\": \"scientist\",\n" +
" \"research\": [\n" +
" {\n" +
" \"area\": \"Chemistry\",\n" +
" \"years\": [\n" +
" {\"year\": 1766},\n" +
" {\"year\": 1781}\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"area\": \"Density of the Earth\",\n" +
" \"years\": [\n" +
" {\"year\": 1797}\n" +
" ]\n" +
" }\n" +
" ]\n" +
" }\n" +
" ]\n" +
"}";
Josson josson = Josson.fromJsonString(json);
// 关键转换:逐层 map 展开,再用 flatten('.') 生成点分路径,[%d] 保留数组索引
JsonNode result = josson.getNode(
"map(people.map(research.map(years.map(year)))).flatten('.','[%d]')");
// 输出键值对:路径 → 值
result.fields().forEachRemaining(entry ->
System.out.println("$." + entry.getKey() + " = " + entry.getValue().asText())
);
}
}输出效果:
立即学习“Java免费学习笔记(深入)”;
$.people[0].research[0].years[0].year = 1766 $.people[0].research[0].years[1].year = 1781 $.people[0].research[1].years[0].year = 1797
✅ 关键要点说明:
- map(...) 操作保持原始结构映射关系,确保路径可追溯;
- flatten('.', '[%d]') 将嵌套对象扁平化为 "a.b[0].c[1]" 形式的字符串键,其中 [%d] 是 Josson 内置语法,自动替换为实际数组下标;
- 最终结果为 JsonNode 对象,调用 .fields() 可安全遍历所有路径-值对;
- 该方案无需手动递归解析或维护路径栈,代码简洁且具备强类型安全性(基于 Jackson)。
⚠️ 注意事项:
- Josson 不是 Jayway 的插件,而是独立库,需显式引入 Maven 依赖:
<dependency> <groupId>com.octomix.josson</groupId> <artifactId>josson</artifactId> <version>1.7.2</version> </dependency> - 若必须沿用 Jayway,可通过 Configuration.defaultConfiguration().addOptions(Option.AS_PATH_LIST) 配合 parse(json).parse(path).getPath() 获取 部分 路径,但其对多层嵌套数组的支持有限且不直观,不推荐用于生产级路径溯源场景。
综上,对于需要精准路径反馈的 JSON 导航类应用,Josson 提供了语义清晰、开箱即用的路径生成能力,是 Jayway JsonPath 在“路径感知”维度的理想补充方案。


















