跳到主要内容

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 概念对照.

XPathJSONPathDescription (描述)
/$根 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 (脚本)
表达式
seamlessn/a表达式引擎
()n/a分组

表 20: XPath 语法与 JSONPath 对照

为进一步说明, 表 21 给出若干 XPath 表达式及其 JSONPath 等价式.

XPathJSONPathResult (结果)
/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 开始.