BoxLang 1.14.0发布:JSONPath集成到DataNavigator,实现全方位数据导航
[LOADING...]
每个应用程序最终都要处理深层嵌套的数据。六层深的 JSON API 响应载荷;你需要的键埋在对象数组里的配置文件,其中一个对象的字段你认为必填却为 null;没有人编写过 schema 的模块元数据结构;以及长得像没有规划过的树一样的运行时自省数据。
BoxLang 在 1.0 版本就引入了 DataNavigator,让你可以使用 dataNavigate(),调用 .from() 来限定作用域,链式调用 .get(),并为每个路径提供默认值。简洁且安全。但即使是流式 API,从复杂载荷中提取特定切片仍然需要多次导航跳转、循环,或者三层深的防御性键存在检查。
BoxLang 1.14.0 改变了这一点。DataNavigator 现在原生支持 JSONPath 风格的路径表达式,并且新增的 query() 方法让你可以在结构上展开并一次性收集所有匹配项。更少的仪式感,更多的信息。
快速回顾:什么是 DataNavigator?
DataNavigator 是 BoxLang 的流式助手,用于安全地遍历嵌套数据结构:结构体、数组、解析后的 JSON、配置文档、运行时元数据。其关键特性是当路径不存在时不会抛出异常——而是根据调用方式返回 null、默认值或空导航器。
通过 dataNavigate() BIF 创建导航器,该 BIF 接受结构体、JSON 字符串、JSON 文件路径或 Java Map。然后使用 .from() 限定作用域,.has() 检查存在性,.get() / .getOrThrow() 提取值。
该 API 仍然像以前一样正常工作。1.14.0 新增的是可以直接放入这些方法中的紧凑表达式语言。
1.14.0 的新增内容
DataNavigator 新增了四个重点功能:
- 在
get()、has()、from()中使用 JSONPath 表达式——当传入包含.或[的单个字符串时,会被视为路径表达式。多参数和普通键调用则完全保持原有行为。 query(path)—— 返回所有匹配项,以 BoxLang 数组形式。通配符、切片、过滤器和递归下降可能产生多个匹配项;query()会全部收集。getOrDefault(key, value)——get()的显式回退变体。保证非 null。比 null 检查模式更简洁。getByKey(key)/hasByKey(key)—— 精确键查找,其中点和括号是字面字符,不是分隔符。用于处理如"db.host"这类实际键名中包含点或括号的载荷。
路径表达式语法
BoxLang 的 JSONPath 方言涵盖了日常工作中最重要的操作。以下是完整参考:
路径表达式语法
路径表达式语法
空格在任何位置都是允许的:
触发规则:
- 含有
.或[的单个字符串被视为路径表达式。 - 多个参数或没有分隔符的字符串保持原有的可变键行为。
所有这些语法都可以在 get()、has()、from() 和 query() 内部使用。
真实场景
场景 1:处理 API 响应
你正在使用一个第三方 REST API。载荷如下所示:
在 1.14.0 之前,提取有库存的产品名称需要先导航到数组,然后循环:
在 1.14.0 中使用 JSONPath 表达式,导航器在一次调用中处理遍历和过滤:
注意区别:get() 返回第一个匹配项。query() 返回所有匹配项(数组形式)。
场景 2:配置自省
你正在编写一个需要检查运行时 boxlang.json 并跨嵌套路径提取设置的模块。某些键可能因部署环境而不存在。
getByKey() / hasByKey() 的区别在以下情况尤为重要:当你的数据由 Java 属性系统、点键配置库或任何键名中包含 . 或 [ 作为真实字符的载荷所构建时。
场景 3:通配符和切片提取
你有一个模块的元数据结构体,并希望为仪表板或诊断工具提取特定切片。
选择正确的方法
四种检索方法服务于不同目的。使用以下指南:
当值可能存在也可能不存在时使用 get() 或 getOrDefault();当缺失数据应立即失败时使用 getOrThrow();当路径可能返回多个结果时使用 query();当需要字面键查找而非路径解析时使用 getByKey()。
一条经验法则:如果你的路径表达式包含 [*]、[n:m]、.. 或过滤器 [?(...)],请选择 query()。这些运算符可能匹配零个、一个或多个节点。get() 只返回第一个命中并静默丢弃其余部分。
汇总示例
以下是一个完整的、真实的示例:加载和验证多环境应用程序配置,然后从每个部分提取所需内容。
没有循环。没有空值守卫塔。没有嵌套的 structKeyExists() 链。路径表达式描述了你想要的数据形状,而导航器处理遍历。
升级与探索
DataNavigator 中的 JSONPath 支持已包含在 BoxLang 1.14.0 中,今天即可使用。无需添加依赖,无需更改配置。如果你已经在使用 dataNavigate(),新表达式是即插即用的增强。现有的可变键调用保持不变。
完整文档位于 boxlang.ortusbooks.com/boxlang-language/syntax/data-navigators。
完整的 1.14.0 发布说明,包括动态集合、区间、内部类、查询转换器以及所有 65 个已关闭的问题,位于 boxlang.ortusbooks.com/readme/release-history/1.14.0。
资源
BoxLang 是由 Ortus Solutions 开发的现代、多运行时 JVM 语言。专为 Web、云端和命令行而生。开源,专业支持。
原文:BoxLang 1.14.0 : Navigate Anything: JSONPath Comes to BoxLang's DataNavigator 首发于 foojay。