python-json校验-jsonpath解析

目录
  • 背景
  • 表示法
  • jsonpath的语法
  • 示例
  • 实战

背景

在进行接口自动化测试的时候,对响应结果进行校验,基本上都是对json数据的校验,响应内容十分复杂,当然验证也是一个很庞大的工程 ,不过都是可以通过jsonpath 解决。

JSONPath 提供了强大的 JSON 解析功能,可以更便捷灵活的用来获取对应的 JSON 内容。

表示法

JSONPath 有两种表示方式, 可以使用点表示法,也可以使用括号表示法

  • 点表示法 例子:$.store.book[0].title
  • 括号表示法 例子:$['store']['book'][0]['title']

官方帮助文档

jsonpath的语法

语法 描述
$ 根对象/元素
@ 当前对象/元素
. 或者 [] 子运算符,匹配下级元素
.. 递归下降,递归方式匹配所有子元素
* 通配符。所有对象/元素,无论其名称
[] 下标运算符,jsonpath 从0开始
[,] 连接的操作符,多个结果拼接成列表返回
[开始:结束:步骤] 从 ES4 借来的数组切片运算符。
?() 应用过滤器(脚本)表达式。
() 脚本表达式,使用底层脚本引擎。

示例

{ "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
    }
  }
}
jsonpath 结果 备注
$.store.book[*].author 所有书籍的作者
$..author 所有的作者
$.store.* 商店下的所有元素/对象,包括书籍和自行车
$.store..price 商店里所有元素/对象的价格
$..book[2] 下标从0开始,第3本书
$..book[(@.length-1)] 按顺序排列最后一本书 用到了()和@两个语法
$..book[-1:] 按顺序排列最后一本书 用到了[]数组下标切片
$..book[0,1] 第1本书和第2本书,前两本书
$..book[:2] 第1本书和第2本书,前两本书 $…book[0:2] ,从0开始,0 1,前两本书
$..book[?(@.isbn)] 有isbn字段的所有书籍
$..book[?(@.price<10)] 所有价格小于10的书籍
$..* json结构的所有元素

实战

安装jsonpath

pip3 install jsonpath

以网上一个开源的获得天气的API为例子:

def test_get_json(self):
        r = requests.get("http://t.weather.sojson.com/api/weather/city/101191102")
        print(r.text)
        r_json = r.json()
        # 用点方法来获得notice的内容
        yesterday = jsonpath(r_json, "$.data.yesterday.notice")
        print(yesterday)
        # 获得aqi=15 的forecast元素
        aqi = jsonpath(r_json, "$..forecast[?(@.aqi==15)]")
        print(aqi)

当不知道有jsonpath这个神器的时候,我是通过遍历一个个元素,然后再去比对具体的字段信息,比如下方:获得duration 超过7000 的api信息

{
	"apis": [{
		"path": "/path",
		"duration": 7890
	}, {
		"path": "/path",
		"duration": 6890
	}, {
		"path": "/path",
		"duration": 5890
	}]
}

通过遍历的方式获得:

apis = '{"apis":[{"path":"/path","duration":7890},{"path":"/path","duration":6890},{"path":"/path","duration":5890}]}'
print(json.loads(apis))
apis_json = json.loads(apis)
# 一个个遍历
api_duration = []
for api in apis_json["apis"]:
   duration = api["duration"]
   if int(duration) > 7000:
       print(str(duration))
       api_duration.append(api["path"])
print(api_duration)

通过jsonpath获得

#jsonpath 更简单
api_duration2 = jsonpath(apis_json, "$.apis[?(@.duration>7000)].path")
print(api_duration2)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2022-11-16

Python json解析库jsonpath原理及使用示例

jsonpath jsonpath 用于多层嵌套 json格式的 解析. pip install jsonpath JsonPath 描述 $ 根节点 @ 现行节点 .or[] 取子节点 n/a 取父节点,jsonpath为支持 .. 就是不管位置,选择所有复合条件的条件 * 匹配所有元素节点 n/a 根据属性访问,json不支持,因为json是个key-value递归结构,不需要数属性访问 [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等) [,] 支持迭代器中做多选

Python使用jsonpath-rw模块处理Json对象操作示例

本文实例讲述了Python使用jsonpath-rw模块处理Json对象操作.分享给大家供大家参考,具体如下: 这两天在写一个爬虫,需要从网站返回的json数据提取一些有用的数据. 向url发起请求,返回的是response,在python3中,response.content是二进制bytes类型的,需要用decode()转成unicode的str类型 #如果用的requests发的请求 import json response = requests.get(url,headers=self.

python的json中方法及jsonpath模块用法分析

本文实例讲述了python的json中方法及jsonpath模块用法.分享给大家供大家参考,具体如下: 什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与后台之间的数据交互. json模块中方法的学习 其中类文件对象的理解: 具有read()或者write()方法的对象就是类文件对象,比如f = open("a.txt",

解析python中的jsonpath&nbsp;提取器

目录 为什么要用jsonpath jsonpath的语法 jsonpath 解析 使用示例 为什么要用jsonpath 就跟为什么要用xpath一样,jsonpath的设计灵感来源于xpath.一个强大的json数据提取工具.让用户不用编写脚本就可以提取到相应的json数据. jsonpath的语法 jsonpath可以什么这两种模式来检索数据:以点为分隔$.store.book[0].title$.store.book[0,1] #可以取到第一个和第二个book值$.store.book[*]

深入解析Python中的descriptor描述器的作用及用法

一般来说,一个描述器是一个有"绑定行为"的对象属性(object attribute),它的访问控制被描述器协议方法重写.这些方法是 __get__(), __set__(), 和 __delete__() .有这些方法的对象叫做描述器. 默认对属性的访问控制是从对象的字典里面(__dict__)中获取(get), 设置(set)和删除(delete)它.举例来说, a.x 的查找顺序是, a.__dict__['x'] , 然后 type(a).__dict__['x'] , 然后找

深入解析Python中的上下文管理器

1. 上下文管理器是什么? 举个例子,你在写Python代码的时候经常将一系列操作放在一个语句块中: (1)当某条件为真 – 执行这个语句块 (2)当某条件为真 – 循环执行这个语句块 有时候我们需要在当程序在语句块中运行时保持某种状态,并且在离开语句块后结束这种状态. 所以,事实上上下文管理器的任务是 – 代码块执行前准备,代码块执行后收拾. 上下文管理器是在Python2.5加入的功能,它能够让你的代码可读性更强并且错误更少.接下来,让我们来看看该如何使用. 2. 如何使用上下文管理器? 看

Python 中闭包与装饰器案例详解

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 1.Python中一切皆对象 这恐怕是学习Python最有用的一句话.想必你已经知道Python中的list, tuple, dict等内置数据结构,当你执行: alist = [1, 2, 3] 时,你就创建了一个列表对象,并且用alist这个变量引用它: 当然你也可以自己定义一个类: class House(object): def __init__(self, are

解析python 中/ 和 % 和 //(地板除)

python / 和 % 和 //(地板除)用于对数据进行除法运算. python中 // 和 / 和 % 简介 python中与除法相关的三个运算符是// 和 / 和 %,下面逐一介绍. "/",这是传统的除法,3/2=1.5 "//",在python中,这个叫"地板除",3//2=1 "%",这个是取模操作,也就是区余数,4%2=0,5%2=1 Python中分为3种除法:1./,2.%,3.//. 1./ 基于 pyth

Python 中的函数装饰器和闭包详解

函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回,也可以将其替换为另一个函数或者可调用对象. 例如:有个名为 decorate 的装饰器: @decorate def target(): print('running target()') 上述代码的写法和以下写法的效果是一样的: def target(): print('running targe

源码解析python中randint函数的效率缺陷

目录 一.前言 二.对randint()运行效率的测试 三.从源码分析randint()的缺陷 random.random() random.randint() 四.更快的生成随机整数的方法 random.random() 直接使用 getrandbits() 使用 Numpy.random 一.前言 前几天,在写一个与差分隐私相关的简单程序时,我发现了一些奇怪的东西:相对于其他的随机数生成函数,Python的random.randint()函数感觉很慢. 由于 randint() 是 Pyth

深入解析Python中的多进程

目录 前言 1.创建进程 2.多进程中的Queue 3.多进程与多线程的性能比较 4.进程池pool 5.共享内存 6.进程锁lock 前言 现在我们的计算机都是多个核的,通俗来说就是多个处理或者计算单元.为了加快运算和处理速度,我们可以将不同的任务交给多个核心进行同时处理,从而提高了运算速度和效率,多个核心同时运作就是多个进程同时进行,这就是多进程. 1.创建进程 创建进程和创建线程的方法基本一致,请看下面代码: # coding:utf-8 # 导入多进程的包,并重命名为mp import

12步入门Python中的decorator装饰器使用方法

装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样的可调用对象(callable object,这样的对象定义有call方法).在Python 2.6以及之后的Pyth

深入学习Python中的上下文管理器与else块

前言 本文主要个大家介绍了关于Python上下文管理器与else块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 在开始之前,我们先来看看下面这段话: 最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的作用不同,而且做的都是简单的事,虽然可以避免不断使用点号查找属性,但是不会做事前准备和事后清理.不要觉得名字一样,就意