使用JSONSchema断言
对于复杂的JSON结构,虽然可以使用JSONPath快速提取相应的值。然而对于JSON响应的整体结构和各字段类型,使用JSONSchema验证更加方便。
安装方法:
pip install jsonschema
基本使用#
以上例中的响应结果为例:
{
"args": {
"age": "12",
"name": "Kevin"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0",
"X-Amzn-Trace-Id": "Root=1-5e7f618f-30ba932936a4a8e64ef5ea06"
},
"origin": "111.202.167.11",
"url": "https://httpbin.org/get?name=Kevin&age=12"
}
整个JSON结构可以描述为,整体为object类型,包含args、headers、orgin、url四个属性,其中args、headers是object类型,origin、url是字符串类型,使用JSONSchema语法描述如下:
{
"type": "object",
"properties": {
"args": {"type": "object"},
"headers": {"type": "object"},
"origin": {"type": "string"},
"url": {"type": "string"}
}
}
对于object对象,还可以使用required描述必须存在的属性。对于args、headers还可以继续添加properties描述其子属性,对于字符串还可以使用patten字段描述其符合的真正表达式。
JSONSchema中的类型分为string、number、integer、array、object、boolean、null七种类型。其中,number包含整数和浮点数,integer仅限整数。JSONSchema每种类型常用的关键字如表3.3所示。
Schema中常用的关键字#
最外层#
- $schema 指定使用的JSONSchema协议版本
- title 规则标题
- description 规则描述
通用#
- type 类型,string、number、integer、array、object、boolean、null
string#
- miniLength 最小长度
- maxLength 最大长度
- pattern 匹配的正则表达式
number/integer#
- minimum 最小值, 结合"exclusiveMinimum": True,不包含等于
- maximum 最大值,结合"exclusiveMaximum": True,不包含等于
- multipleOf 可被指定数字整除
object#
- properites 子属性
- patternProperties 子属性名满足正则表达式
- required 必选子属性
array#
- items 子元素
- required 必选子元素
- miniItems 最少子元素个数
- maxItems 最大子元素个数
使用示例#
完整示例如下:
import requests
import jsonschema
res = requests.get('https://httpbin.org/get?name=Kevin&age=12')
schema = {
"type": "object",
"properties": {
"args": {
"type": "object",
"required": ["name", "age"],
"properties": {
"name": {"type": "string", "pattern": "^Kevin$"},
"age": {"type": "string", "pattern": "^12$"}
}
},
"headers": {"type": "object"},
"origin": {"type": "string", "pattern": "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"},
"url": {"type": "string"}
}
}
jsonschema.validate(res.json(), schema)
上例中,required限定,args必须有name和age两个子属性。
name字段的pattern使用“^Kevin$”表示,必须以K开头,以n结尾,即完全等于Kevin。
同样,断言通过时不会有任何输出,断言失败是则会抛出异常。
作者:韩志超
出处:https://www.cnblogs.com/superhin/p/12596752.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如有问题,请微信联系 superz-han,并发送原文链接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现