python基础之通过jsonpath解析json数据

概要 

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前被广泛应用,在实际使用过程中不管是开发工程师还是测试工程师都必须学会json数据的处理。

Python中有几个库可以比较好的处理json数据,比如内置库json、外部库Demjson、jsonpath,上一章节介绍了json库的使用方法(json库使用),本章主要介绍外部库jsonpath的使用

日常编码过程中遇到比较复杂的JSON数据,想要根批量提取自己想要的JSON数据里的内容,是比较麻烦的。JsonPath 模块正好能解决这类问题,JsonPath类似于XPath,支持选择器、过滤器和函数等功能,能够方便地从JSON数据中提取所需信息。

学习目录

jsonpath安装

jsonpath使用

jsonpath语法

使用介绍 

jsonpath安装

通过pip install jsonpath命令安装jsonpath库

jsonpath使用

通过from jsonpath import jsonpath导入所需模块

jsonpath()函数传入的对象是字典;如果是json字符串数据需要事先转换为字典。

  • 使用时如果没有匹配到数据,返回False;
  • 使用时如果匹配到数据,返回的是包含数据的列表list

jsonpath语法

jsonpath的语法比较简单和直观。它使用点号(.)和方括号([])来访问JSON对象的属性和数组元素,下面是一些常用的jsonpath语法:

原字符

描述

$

表示根节点,是jsonpath表达式的开始

@

当前节点

. or []

子节点

..

递归搜索(搜索符合条件的所有数据)

*

通配符,表示所有的内容

[]

支持访问数组,可以用于处理索引,元素等情况

[,]

支持迭代器中做多选,多个key用逗号隔开

[start:end:step]

数组分割操作,等同于切片

?()

应用过滤表示式,一般与@结合使用

使用介绍

定义一个字典,存放用户的姓名/年龄/住址等信息。

from jsonpath import jsonpath
json_data = {"name":"userinfo",
             "province":"js",
             "users":[
               {"name":"lili","age":21,
                "address":["nj","jiangningqu","xixihuayuan"]},
               
               {"name":"nana","age":20,
                "address":["yz","qixiaqu","qinqinhuayuan"]},
               
               {"name":"xinxin","age":21,
                "address":["sz","yuhuataiqu","huiyuhuayuan"]}
               
                    ]
            }
  • 使用$.users获取第1个节点users的全部信息

print(jsonpath(json_data,'$.users'))
#结果如下
[[{'name': 'lili', 'age': 21, 'address': ['nj', 'jiangningqu', 'xixihuayuan']}, 
  {'name': 'nana', 'age': 20, 'address': ['yz', 'qixiaqu', 'qinqinhuayuan']}, 
  {'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]]
  • 使用$.users[*]获取users对应数组内所有的数据
print(jsonpath(json_data,'$.users[*]'))
#结果如下: 可以发现该结果返回的列表比上面的少一个[]
[{'name': 'lili', 'age': 21, 'address': ['nj', 'jiangningqu', 'xixihuayuan']}, 
 {'name': 'nana', 'age': 20, 'address': ['yz', 'qixiaqu', 'qinqinhuayuan']},
 {'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]
  • 使用$.users[0,2]获取users的数组内第1和第3个数据
print(jsonpath(json_data,'$.users[0,2]'))
#结果如下
[{'name': 'lili', 'age': 21, 'address': ['nj', 'jiangningqu', 'xixihuayuan']}, {'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]

  • 使用$.users.[name]获取数组内所有的name的值
print(jsonpath(json_data,'$.users.[name]'))
#结果如下
['lili', 'nana', 'xinxin']
  • 使用$.users[0].name获取数组第1个索引对应的name
print(jsonpath(json_data,'$.users[0].name'))
#结果如下
['lili']
  • 使用'$..name'获取所有key为name的值
print(jsonpath(json_data,'$..name'))
#结果如下
['userinfo', 'lili', 'nana', 'xinxin']
  • 使用$.users..age获取users对应数组内所有age的值
print(jsonpath(json_data,'$.users..age'))
#结果如下
[21, 20, 21]
如果明确知道users的数组的层级关系,使用jsonpath(json_data,'$.users.[*][age]')等同于上面的查找结果

JSONPATH的过滤器

JSONPATH还支持使用过滤器来对JSON数据进行更精细的查询和过滤。过滤器中使用方括号[]中的表达式来指定过滤条件。下面是一些常见的过滤器:

==:等于

!=:不等于

<:小于

<=:小于或等于

>:大于

>=:大于或等于

=~:正则表达式匹配

!~:不匹配正则表达式

  • 使用$.users[(@.length-1)]过滤数组最后一条数据
print(jsonpath(json_data,'$.users[(@.length-1)]'))
#结果如下
[{'name': 'xinxin', 'age': 21, 'address': ['sz', 'yuhuataiqu', 'huiyuhuayuan']}]
  • 使用$.users.[?(@.age==20)]过滤数组中age等于20的数据
print(jsonpath(json_data,'$.users.[?(@.age==20)]'))
#结果如下
[{'name': 'nana', 'age': 20, 'address': ['yz', 'qixiaqu', 'qinqinhuayuan']}]

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值