简介

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数据相关推荐

  1. Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)

    JSON介绍: JSON:JavaScript对象表示法 JSON是存储和交换文本信息的语法. 特点: JSON是轻量级的文本数据交换格式 JSON独立于语言和平台 JSON具有自我描述性,更易理解 ...

  2. C/C++程序开发: cJSON的使用(创建与解析JSON数据)

    一.cJSON介绍 cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解析器,是一个用C语言编写的简单好用的JSON解析器:它只包含一个C文件和一个头文件,可以非常 ...

  3. wps解析json数据_一些非常实用的JSON 教程

    以下内容来自W3school. JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 ...

  4. JSONObject 和 GSON 解析 JSON 数据详解(转)

    转载:http://www.jianshu.com/p/f99de3ec0636 点此进入:从零快速构建APP系列目录导图 点此进入:UI编程系列目录导图 点此进入:四大组件系列目录导图 点此进入:数 ...

  5. 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据

    一 JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON建构于两种结构:json是Javascript中的对象和数组中的对象, ...

  6. Python爬虫笔记——解析json数据(以周杰伦歌单为例)及Headers

    一.Network Network能够记录浏览器的所有请求.我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看 ...

  7. Java解析JSON数据

    Java解析JSON数据 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式. 它基于 ECMAScript (欧洲计 ...

  8. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  9. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

最新文章

  1. 求助:谁可以给我点share point 开发的资料
  2. 综述:Image Caption 任务之语句多样性
  3. mysql表恢复报错binlog_mysqlbinlog 恢复报错ERROR at line 24826643: Unknown command '\'汗血宝马...
  4. Multi-catch parameters are not allowed for source level below 1.7 解决方法
  5. 协程入门(一):启动与挂起
  6. TypeScript内置对象
  7. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...
  8. 博文视点大讲堂第24期:PPT演示之道
  9. sqlhelp(sqlite)
  10. 几款免费好用的OCR工具
  11. 与你一起学习MS Project——基础篇:Project基础应用
  12. php 输出git fetch,git fetch
  13. win7搭建VM10虚拟机,搭建win7旗舰版64系统
  14. matlab练习程序(RGB2CMY、CMY2RGB)
  15. HashMap为什么要使用红黑树
  16. JavaSE-饿了么项目实战
  17. Linux虚拟机在线添加GPT格式硬盘
  18. IEEE会议投稿资料汇总http://cadcg2015.nwpu.edu.cn/index.htm
  19. 服务器显示拥挤进不去怎么办,《拥挤城市》游戏进不去怎么办 玩不了解决方法...
  20. 聚焦低代码SaaS云服务,让企业轻松办公!

热门文章

  1. ubuntu双系统安装教程
  2. 如何关闭计算机自动休眠状态,电脑自动待机怎么关闭【图解】
  3. 握手定理(握手数之和为偶数)和相关2个推论
  4. 快速搭建日志系统——ELK STACK
  5. 谷歌升级商业搜索软件
  6. ACM常用模板-数据结构
  7. NCC的openApi介绍、NCC二开,对接NCC、简化版的openapi服务
  8. 100天搞定机器学习:PyYAML基础教程
  9. java 电商锁库存实现_电商项目扣减库存方案
  10. sqlmap 使用方法