
本文介绍一种简洁高效的 JSON 字段过滤方案:利用 Josson 库的 map() 查询表达式,根据指定 JSON 路径(如 $.a.a2、$.c)提取并重构原始 JSON,仅保留目标字段及其嵌套结构。
本文介绍一种简洁高效的 json 字段过滤方案:利用 josson 库的 `map()` 查询表达式,根据指定 json 路径(如 `$.a.a2`、`$.c`)提取并重构原始 json,仅保留目标字段及其嵌套结构。
在 Java 生态中,Jayway JsonPath 擅长查询与提取,但原生不支持“按路径列表重建精简对象”这一常见需求——例如给定路径 ["$.a.a2", "$.c"] 和源 JSON,期望输出仅含 a.a2 与 c 的结构化子集({"a":{"a2":2},"c":[]}),而非扁平值列表。手动遍历路径、去重、逐层构建映射关系(如问题中描述的最小化路径集 + 深度 map 构建)虽可行,但代码冗长、易错且难以维护。
此时,Josson 提供了一种声明式、函数式解决方案。它以类 SQL 的查询语法(非标准 JSONPath)为核心,内置 map() 函数专为字段投影与嵌套结构保留而设计:
import com.octomix.josson.Josson;
import com.fasterxml.jackson.databind.JsonNode;
Josson josson = Josson.fromJsonString(
"{" +
" \"a\": {\"a1\": 1, \"a2\": 2}," +
" \"b\": \"foo\"," +
" \"c\": []" +
"}");
JsonNode result = josson.getNode("map(a.map(a2), c)");
System.out.println(result.toPrettyString());输出结果严格符合预期:
{
"a": {
"a2": 2
},
"c": []
}该查询 map(a.map(a2), c) 可直观理解为:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 外层
map(...)表示构造新对象; -
a.map(a2)表示对a字段执行子映射,仅保留其a2子字段; -
c直接作为顶层键完整保留(包括其空数组值)。
✅ 优势总结:
- 零手动构建:无需解析路径、处理嵌套、管理中间 Map;
- 语义清晰:查询表达式直接反映目标结构,可读性与可维护性高;
-
类型安全:返回 Jackson
JsonNode,无缝集成现有 JSON 处理流程; - 轻量可靠:Josson 无反射依赖,性能稳定,GitHub 活跃维护(截至 2024 年持续更新)。
⚠️ 注意事项:
- Josson 使用自定义查询语法(非 JSONPath 标准),需学习
map()、array()等核心函数; - 路径书写为“点号分隔的字段名”(如
a.a2),而非$开头的 JSONPath 表达式; - 若需动态拼接路径(如从字符串列表生成查询),建议封装工具方法预处理路径格式(例如将
"$.a.a2"转为"a.map(a2)")。
对于需要高频、精准 JSON 字段裁剪的场景(如 API 响应脱敏、微服务间数据精简传输),Josson 的 map() 是比手动路径操作更专业、更可持续的工程实践选择。

















