python之jsonpath库
作者:YXN-python 阅读量:102 发布日期:2022-10-01
JSONPath 语法元素与其 XPath 对应元素的完整概述和并排比较
Xpath | JsonPath | 描述 |
/ | $ | 根节点 |
. | @ | 现行节点 |
/ | .or[] | 取子节点 |
.. | n/a | 就是不管位置,选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
[] | [] | 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等) |
| | [,] | 支持迭代器中做多选 |
[] | ?() | 支持过滤操作 |
n/a | () | 支持表达式计算 |
() | n/a | 分组, Json Path不支持 |
此外,下标运算符在 Xpath 和 JSONPath 中的工作方式也存在显着差异。
- XPath 表达式中的方括号始终在 *节点集* 由上一个路径片段产生。索引始终以 1 开头。
- 使用 JSONPath 方括号操作在 *对象* 或 *数组* 由上一个路径片段寻址。索引始终以 0 开头。
案例:
{ "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 | 结果 |
/store/book/author | $.store.book[*].author | 商店中所有书籍的作者 |
//author | $..author | 所有作者 |
/store/* | $.store.* | 商店里的所有东西,都是一些书和一辆红色的自行车 |
/store//price | $.store..price | 商店里所有东西的价格 |
//book[3] | $..book[2] | 第三本书 |
//book[last()] | $..book[(@.length-1)] 或 $..book[-1:] | 最后一本书按顺序排列 |
//book[position()<3] | $..book[0,1] $..book[:2] |
前两本书 |
//book[isbn] | $..book[?(@.isbn)] | 过滤所有带有 ISBN 编号的图书 |
//book[price<10] | $..book[?(@.price<10)] | 过滤所有便宜于10的书籍 |
//* | $..* | XML 文档中的所有元素。JSON 结构的所有成员 |
问题
- 目前 JSONPath 表达式中只允许使用单引号。
- JSONPath 位置内的脚本表达式当前未由 `jsonPath`.只有全球 `$` 和本地 `@` 符号通过简单的正则表达式进行扩展。
- 替代 `jsonPath` 返回 `false` 在以下情况下 *无匹配* 将来可能会返回一个空数组。
举例:
url = ''
obj = json.loads(requests.get(url).text)
singer = jsonpath.jsonpath(obj, '$.result.songs[*].artists[0].name')
YXN-python
2022-10-01