JSONPath库:使用类似Xpath的语法解析JSON数据
简介
JSONPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。JsonPath 对于 JSON 来说,相当于 XPath 对于 XML。
官方文档:http://goessner.net/articles/JsonPath
安装方法:pip install jsonpath
JsonPath与Xpath语法对比
Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
XPath | JSONPath | 描述 |
---|---|---|
/ | $ | 根节点 |
. | @ | 现行节点v |
/ | .or[] | 取子节点 |
… | n/a | 取父节点,Jsonpath未支持 |
// | … | 就是不管位置,选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
@ | n/a | 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要。 |
[] | [] | 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等) |
[,] | 支持迭代器中做多选。 | |
[] | ?() | 支持过滤操作. |
n/a | () | 支持表达式计算 |
() | n/a | 分组,JsonPath不支持 |
JSONPath表达式支持点号标记法和括号标记法。$.store.book[0].title
等价于$['store']['book'][0]['title']
使用方法
JSONPath的API非常简单,最常用的就是jsonpath
函数。
jsonpath
函数的原型如下:jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True)
参数如下:
obj
:类型为字典,即JSON数据。必备参数。expr
:类型为字符串,即JSONPath表达式。必备参数。- result_type:类型为字符串,即返回值类型。可选参数。
- 默认值为
'VALUE'
,返回匹配的值。 IPATH''
,以列表形式返回匹配值的JSONPath路径索引。- 其他值,返回匹配值的JSONPath表达式字符串。
- 默认值为
返回值:类型为列表或False
,无匹配值时返回值为False
。
案例:JSONPath返回值类型
import jsonpath
from pprint import pprintjsonobj ={ "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}}
}# 返回值
all_prices = jsonpath.jsonpath(jsonobj,'$..price')
pprint(all_prices)
# 返回JSONPATH路径索引列表
all_prices = jsonpath.jsonpath(jsonobj,'$..price',result_type='IPATH')
pprint(all_prices)
# 返回JSONPATH表达式字符串
all_prices = jsonpath.jsonpath(jsonobj,'$..price',result_type='')
pprint(all_prices)
结果为:
[8.95, 12.99, 8.99, 22.99, 19.95]
[['store', 'book', '0', 'price'],['store', 'book', '1', 'price'],['store', 'book', '2', 'price'],['store', 'book', '3', 'price'],['store', 'bicycle', 'price']]
["$['store']['book'][0]['price']","$['store']['book'][1]['price']","$['store']['book'][2]['price']","$['store']['book'][3]['price']","$['store']['bicycle']['price']"]
案例: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 | 含义 |
---|---|---|
/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元的图书 |
//*
|
$..*
|
整个JSON |
import jsonpath
from pprint import pprintjsonobj ={ "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}}
}
# 返回所有图书的价格
book_prices = jsonpath.jsonpath(jsonobj,'$.store.book[*].price')
pprint(book_prices)
# 返回所有商品的价格
all_prices = jsonpath.jsonpath(jsonobj,'$..price')
pprint(all_prices)
# 返回商店中所有商品的价格
store_prices = jsonpath.jsonpath(jsonobj,'$.store..price')
pprint(store_prices)
# 返回第三本书的信息
book3 = jsonpath.jsonpath(jsonobj,'$..book[2]')
pprint(book3)
# 返回第三本书的属性列表
book_attr = jsonpath.jsonpath(jsonobj,'$..book[2][*]')
pprint(book_attr)
# 返回第三本书的标题和作者
book_attr = jsonpath.jsonpath(jsonobj,'$..book[2][title,author]')
pprint(book_attr)
# 返回前两本书的信息
books12 = jsonpath.jsonpath(jsonobj,'$..book[:2]')
pprint(books12)
# 返回包含isbn属性的图书信息
isbns = jsonpath.jsonpath(jsonobj,'$..book[?(@.isbn)]')
pprint(isbns)
# 返回价格低于10元的图书
price10 = jsonpath.jsonpath(jsonobj,'$..book[?(@.price<10)]')
pprint(price10)
结果为:
[8.95, 12.99, 8.99, 22.99]
[8.95, 12.99, 8.99, 22.99, 19.95]
[8.95, 12.99, 8.99, 22.99, 19.95]
[{'author': 'Herman Melville','category': 'fiction','isbn': '0-553-21311-3','price': 8.99,'title': 'Moby Dick'}]
[{'author': 'Nigel Rees','category': 'reference','price': 8.95,'title': 'Sayings of the Century'},{'author': 'Evelyn Waugh','category': 'fiction','price': 12.99,'title': 'Sword of Honour'}]
['fiction', 'Herman Melville', 'Moby Dick', '0-553-21311-3', 8.99]
['Moby Dick', 'Herman Melville']
[{'author': 'Herman Melville','category': 'fiction','isbn': '0-553-21311-3','price': 8.99,'title': 'Moby Dick'},{'author': 'J. R. R. Tolkien','category': 'fiction','isbn': '0-395-19395-8','price': 22.99,'title': 'The Lord of the Rings'}]
[{'author': 'Nigel Rees','category': 'reference','price': 8.95,'title': 'Sayings of the Century'},{'author': 'Herman Melville','category': 'fiction','isbn': '0-553-21311-3','price': 8.99,'title': 'Moby Dick'}]
JSONPath库:使用类似Xpath的语法解析JSON数据相关推荐
- Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
JSON介绍: JSON:JavaScript对象表示法 JSON是存储和交换文本信息的语法. 特点: JSON是轻量级的文本数据交换格式 JSON独立于语言和平台 JSON具有自我描述性,更易理解 ...
- C/C++程序开发: cJSON的使用(创建与解析JSON数据)
一.cJSON介绍 cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解析器,是一个用C语言编写的简单好用的JSON解析器:它只包含一个C文件和一个头文件,可以非常 ...
- wps解析json数据_一些非常实用的JSON 教程
以下内容来自W3school. JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 ...
- JSONObject 和 GSON 解析 JSON 数据详解(转)
转载:http://www.jianshu.com/p/f99de3ec0636 点此进入:从零快速构建APP系列目录导图 点此进入:UI编程系列目录导图 点此进入:四大组件系列目录导图 点此进入:数 ...
- 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据
一 JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON建构于两种结构:json是Javascript中的对象和数组中的对象, ...
- Python爬虫笔记——解析json数据(以周杰伦歌单为例)及Headers
一.Network Network能够记录浏览器的所有请求.我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看 ...
- Java解析JSON数据
Java解析JSON数据 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式. 它基于 ECMAScript (欧洲计 ...
- java构造和解析json_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- java json解析 代码_Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
最新文章
- 求助:谁可以给我点share point 开发的资料
- 综述:Image Caption 任务之语句多样性
- mysql表恢复报错binlog_mysqlbinlog 恢复报错ERROR at line 24826643: Unknown command '\'汗血宝马...
- Multi-catch parameters are not allowed for source level below 1.7 解决方法
- 协程入门(一):启动与挂起
- TypeScript内置对象
- 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...
- 博文视点大讲堂第24期:PPT演示之道
- sqlhelp(sqlite)
- 几款免费好用的OCR工具
- 与你一起学习MS Project——基础篇:Project基础应用
- php 输出git fetch,git fetch
- win7搭建VM10虚拟机,搭建win7旗舰版64系统
- matlab练习程序(RGB2CMY、CMY2RGB)
- HashMap为什么要使用红黑树
- JavaSE-饿了么项目实战
- Linux虚拟机在线添加GPT格式硬盘
- IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm
- 服务器显示拥挤进不去怎么办,《拥挤城市》游戏进不去怎么办 玩不了解决方法...
- 聚焦低代码SaaS云服务,让企业轻松办公!