Python3下利用JsonPath解析数据
前言
常见Web接口返回数据的时候,大部分是以 JSON 的形式返回,如果返回数据量不大的话,我们可以直接通过 字典取值 或 正则取值 的方式来直接获取。
但如果接口返回数据量比较大,或者嵌套的层级非常深,这种情况下使用
字典取值就会变得有点困难;而正则取值虽然是万能的方法,但其只针对字符串才能使用。
那么在 Python 中,对于以上情况,有没有更好更方便的方法呢?今天我们就来学习一款JSON解析神器:JsonPath,它是专门用来解析提取JSON数据用的。
本人环境:Python 3.7.0、jsonpath 0.82
JsonPath安装
在 Python 中,为了使用JsonPath来解析数据,我们需要安装第三方库,命令如下:
pip3 install jsonpath
JsonPath语法示例
在 JsonPath 中使用 $ 来表示根节点,或者说使用 $ 来表示整个JSON数据。假如存在以下 data 数据:
{
"store": {
"book": [
{
"category": "新闻学",
"author": "张三",
"title": "图书标题1",
"price": 8.95
},
{
"category": "金融学",
"author": "李四",
"title": "图书标题2",
"price": 12.00
},
{
"category": "计算机",
"author": "王五",
"title": "图书标题3",
"isbn": "0-553-21311-3",
"price": 9.99
},
{
"category": "医学",
"author": "赵六",
"title": "图书标题4",
"price": 22.99
}
],
"phone": {
"color": "red",
"price": 1999.00,
"author": "孙七"
},
"author": "周八",
"price": 1.00
},
"author": "吴九"
}
以下是JsonPath的简单语法示例:
| JsonPath | 返回结果 |
|---|---|
| $.store.book[*].author | 所有book的author |
| $.author | 仅子节点下的author |
| $..author | 所有节点下的author |
| $.store.* | store的所有元素,包括 book 和 phone |
| $.store..price | store的所有price |
| $..book[2] | book的第3个元素 |
| $..book[(@.length - 2)] | book的倒数第2个元素 |
| $..book[:2] | book的前面2个元素 |
| $..book[-2:] | book的最后2个元素 |
| $..book[0,3] | book的第1个元素、第4个元素 |
| $..book[?(@.isbn)] | book中所有带有 isbn 的元素 |
| $.store.book[?(@.price < 10)] | book中所有price小于10的元素 |
| $..* | 所有元素 |
注意:使用 JsonPath 时,索引是从 0 开始计算。
jsonpath使用
我们在Python中结合第三方库 jsonpath 来处理JSON数据时,使用方式为:jsonpath.jsonpath(data, jsonpath表达式),如果成功从 data 中提取到数据,那么会返回一个list列表,否则直接返回False。
import jsonpath
data = {
"store": {
"book": [
{
"category": "新闻学",
"author": "张三",
"title": "图书标题1",
"price": 8.95
},
{
"category": "金融学",
"author": "李四",
"title": "图书标题2",
"price": 12.00
},
{
"category": "计算机",
"author": "王五",
"title": "图书标题3",
"isbn": "0-553-21311-3",
"price": 9.99
},
{
"category": "医学",
"author": "赵六",
"title": "图书标题4",
"price": 22.99
}
],
"phone": {
"color": "red",
"price": 1999.00,
"author": "孙七"
},
"author": "周八",
"price": 1.00
},
"expensive": 10,
"author": "吴九"
}
res1 = jsonpath.jsonpath(data, "$.store.book[*].author")
print("所有book的author:{}".format(res1))
res2 = jsonpath.jsonpath(data, "$.store..price")
print("store的所有price:{}".format(res2))
res3 = jsonpath.jsonpath(data, "$..book[0,3]")
print("book的第1个元素、第4个元素:{}".format(res3))
res4 = jsonpath.jsonpath(data, "$.store.book[?(@.price < 10)]")
print("book中所有price小于10的元素:{}".format(res4))
作者:wintest
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

浙公网安备 33010602011771号