JSONPath 学习笔记

什么是 JSONPath?

JSONPath 是一种类似于 XPath 的查询语言,用于在 JSON 数据中定位和提取特定部分的数据。它提供了一种简洁而强大的方式来导航和检索 JSON 结构中的元素,使得我们可以轻松地从复杂的 JSON 数据中提取所需的信息。

JSONPath表达式

JSONPath引用JSON结构,就像XPath表达式引用XML文档一样。由于JSON结构通常是匿名的,不一定有“根成员对象”,JSONPath假定为最外层对象的抽象名称为$

JSONPath表达式可使用点符

$.store.book[0].title

或者是括号符

$['store']['book'][0]['title']

f用于输入路径。内部或输出路径将始终转换为更通用的括号符。

JSONPath允许使用通配符*表示成员名和数组索引。它借用了后代运算符..来自E4X以及来自ECMASCRIPT 4数组切片语法提议 [start:end:step]

底层脚本语言 (<expr>)的表达式可以用作显式名称或索引的替代方案,如

$.store.book[(@.length-1)].title

使用符号@表示当前对象。通过语法 ?(<boolean expr>) 支持筛选表达式,如

$.store.book[?(@.price < 10)].title

以下是JSONPath语法元素与其XPath对应元素的完整概述和并排比较。

XPath JSONPath 描述
/ $ 根对象/元素
. @ 当前对象/元素
/ .[] 获取子元素操作
.. 获取父元素操作
// .. 递归下降操作符(后代选择器),用于访问所有匹配的元素,无论它们在JSON结构中的深度如何。
* * 通配符。匹配所有对象/元素名称或索引。
@ 访问属性。 JSON结构没有属性。
[] [] 下标运算符。XPath使用它来迭代元素集合和谓词. 在Javascript和JSON中,它是原生数组运算符。
` ` [,]
[start:end:step] 从ES4借鉴的数组切片运算符
[] ?() 应用筛选器(脚本)表达式。
() 使用底层脚本引擎的脚本表达式。
() Xpath中的分组

XPath提供的(非缩写语法的位置路径、运算符和函数)比这里列出的要多得多。此外,Xpath和JSONPath中下标运算符的工作方式存在显著差异。

  • Path表达式中的方括号始终对括号之前这段路径获取的节点集进行操作。索引始终以1开头。
  • 使用JSONPath方括号对括号之前这段路径获取的对象数组进行操作。索引始终以0开头。

JSONPath 示例

{
	"store": {
		"book": [{
				"category": "reference",
				"author": "Nigel Rees",
				"title": "Sayings of the Century",
				"price": 8.95
			},
			{
				"category": "fiction",
				"author": "Evelyn Waugh",
				"title": "Sword of Honour",
				"price": 12.99
			},
			{
				"category": "fiction",
				"author": "Herman Melville",
				"title": "Moby Dick",
				"isbn": "0-553-21311-3",
				"price": 8.99
			},
			{
				"category": "fiction",
				"author": "J. R. R. Tolkien",
				"title": "The Lord of the Rings",
				"isbn": "0-395-19395-8",
				"price": 22.99
			}
		],
		"bicycle": {
			"color": "red",
			"price": 19.95
		}
	}
}
XPath JSONPath Result
/store/book/author $.store.book[*].author 获取store中所有book的author
//author $..author 获取所有authors
/store/* $.store.* 获取store中的所有东西, 即一些book和bicyle,输出显示上述示例JSON中"book"和"bicyle"键对应值
/store//price $.store..price 获取store中所有东西的price
//book[3] $..book[2] 获取第三个book
//book[last()] $..book[(@.length-1)] $..book[-1:] 按序获取最后一个book
//book[position()<3] $..book[0,1] $..book[:2] 获取前两个book
//book[isbn] $..book[?(@.isbn)] 获取所有isbn号为真的book
//book[price<10] $..book[?(@.price<10)] 获取所有price小于10的book
//* $..* 获取XML文档中的所有元素。JSON结构中的所有成员。

说明:

  • 过滤器支持常见的逻辑运算符:与(&&)、或(||),非(!)。

    示例: 获取所有price小于10且cateogry等于reference的book

    $.store.book[?(@.price < 10 && @.category ==  "reference")] 
    

参考链接

https://goessner.net/articles/JsonPath/

posted @ 2024-12-13 23:11  授客  阅读(41)  评论(0编辑  收藏  举报