Appendix B. Inspired by XPath (XPath 的启发)
Appendix B. Inspired by XPath (XPath 的启发)
本附录为 informative (资料性).
JSONPath 发明时, XML 以拥有分析, 转换与从 XML 文档中有选择地提取数据的强大工具著称. [XPath] 即其中之一.
2007 年, 为新兴的 JSON 社区解决同类问题的需求变得明显, 特别是:
-
在 [RFC8259] JSON 值中交互式查找数据并提取, 而无需特殊脚本, 以及
-
由客户端在请求中指定 JSON 数据的相关部分, 使服务器减少响应数据量, 降低带宽占用.
(注意: XPath 自 2007 年以来已演进, 新版本甚至名义上支持在 JSON 值内操作. 本附录仅讨论 2007 年可用的更广泛使用的 XPath 版本.)
JSONPath 承袭 XPath 的整体风格, 但将概念映射为使用动态语言中 JSON 的人所熟悉的语法 (及部分语义).
例如, 在 JavaScript, Python, PHP 等流行的动态编程语言中, XPath 表达式:
/store/book[1]/title
可在下列表达式中实现:
x.store.book[0].title
或方括号记法:
x['store']['book'][0]['title']
其中变量 x 持有 query argument.
JSONPath 语言的设计目标是:
-
自然基于上述语言特性,
-
仅覆盖 XPath 1.0 最核心部分,
-
代码体积与内存占用轻量, 以及
-
运行时高效.
B.1. JSONPath and XPath (JSONPath 与 XPath)
JSONPath 表达式作用于 JSON 值, 如同 XPath 表达式与 XML 文档配合使用. JSONPath 用 $ 指向 query argument 的根节点, 类似 XPath 前导的 /.
JSONPath 表达式使用 dot notation (点记法) ($.store.book[0].title) 或 bracket notation (方括号记法) ($['store']['book'][0]['title']) 在层次结构中下行; 二者取代查询表达式中 XPath 的 /, 其中 dot notation 为轻量但受限的语法, bracket notation 为更重但更通用的语法.
JSONPath 与 XPath 均用 * 表示通配符. JSONPath 的 descendant segment 记法以 .. 开头, 借自 [E4X], 类似 XPath 的 //. 数组切片构造 [start:end:step] 为 JSONPath 独有, 受 ECMASCRIPT 4 的 [SLICE] 启发.
Filter expression 通过 ?<logical-expr> 语法支持, 例如:
$.store.book[[email protected] < 10].title
表 20 在表 1 基础上扩展, 与类似 XPath 概念对照.
| XPath | JSONPath | Description (描述) | |
|---|---|---|---|
| / | $ | 根 XML 元素 | |
| . | @ | 当前 XML 元素 | |
| / | . 或 [] | 子节点运算符 | |
| .. | n/a | 父节点运算符 | |
| // | ..name, | 后代 (JSONPath 自 | |
| ..[index], ..*, | E4X 借用此语法) | ||
| 或 ..[*] | |||
| * | * | 通配符: 所有 XML | |
| 元素, 与其名称无关 | |||
| @ | n/a | 属性访问: JSON | |
| 值无属性 | |||
| [] | [] | 下标: 用于遍历 | |
| XML 元素集合并 | |||
| 用作谓词 | |||
| [,] | 并集 (结果为节点 | ||
| 集的组合); JSONPath | |||
| 称 list operator, 可 | |||
| 组合成员名, 数组 | |||
| index 与 slice | |||
| n/a | [start:end:step] | 数组 slice, 借自 ES4 | |
| 运算符 | |||
| [] | ? | 应用 filter (脚本) | |
| 表达式 | |||
| seamless | n/a | 表达式引擎 | |
| () | n/a | 分组 |
表 20: XPath 语法与 JSONPath 对照
为进一步说明, 表 21 给出若干 XPath 表达式及其 JSONPath 等价式.
| XPath | JSONPath | Result (结果) |
|---|---|---|
| /store/book/author | $.store.book[*].author | 书店中 |
| 所有书的作者 | ||
| //author | $..author | 所有作者 |
| /store/* | $.store.* | 书店中所有 |
| 条目, 即若干 | ||
| 书与红色自行车 | ||
| /store//price | $.store..price | 书店中 |
| 一切的价格 | ||
| //book[3] | $..book[2] | 第三本书 |
| //book[last()] | $..book[-1] | 按顺序 |
| 最后一本书 | ||
| //book[position()<3] | $..book[0,1] | 前两本书 |
| $..book[:2] | ||
| //book[isbn] | $..book[[email protected]] | 筛选带 ISBN |
| 的书 | ||
| //book[price<10] | $..book[[email protected]<10] | 筛选价格 |
| 低于 10 的书 | ||
| //* | $..* | XML 文档中 |
| 所有元素; 输入值中 | ||
| 所有成员值与 | ||
| 数组元素 |
表 21: 示例 XPath 表达式及其 JSONPath 等价式
XPath 的功能远多于本对照所列 (非简写形式中的 location path, 运算符与函数等). 此外, XPath 与 JSONPath 中下标运算符的工作方式存在显著差异:
-
XPath 表达式中的方括号始终作用于前一路径片段产生的 node set (节点集). Index 恒从 1 开始.
-
JSONPath 中, 方括号作用于前一查询 segment 产生的 nodelist 中的每个节点. Array index 恒从 0 开始.