目录

1.介绍

2.安装

3.使用

3.1type关键字

3.2最大值最小值

3.2.1minimum 、 maximum

3.2.2 exclusiveMinimum 、exclusiveMaximum

3.3字符串特殊校验

3.4数据约束

3.5对象约束

3.6必须属性

3.7依赖关系

4.总结


 

1.介绍

JSON Schema 是一个用来定义和校验 JSONweb 规范,简而言之,JSON Schema 是用来校验 json 是否符合预期。

根据 json 创建 JSON Schema 后,你可以使用你选择的语言中的验证器将示例数据与你的模式进行验证。

在线JSON转Schema工具 - ToolTT在线工具箱

2.安装

pip install jsonschema==4.23.0

3.使用

3.1type关键字

type 关键字指定了数据类型,可用于验证 JSON 数据中每个属性的数据类型是否符合预期。常用的数据类型如下:

type解释
string字符串类型,用于文本数据。
number数字类型,用于表示浮点数。
integer整数类型,用于表示整数。
boolean布尔类型,值为 true 或 false。
object对象类型,用于嵌套的 JSON 对象。
array数组类型,用于列表或集合。
null空值类型。

properties 是一个验证关键字。当你定义 properties 时,你创建了一个对象,其中每个属性代表正在验证的 JSON 数据中的一个键。

from jsonschema import validatedef test2():(字典结构,键值对形式)json={"name": "zhangsan","height": 175.55}(用于校验json_data的结构)jsonschema = {"type": "object","properties": {"name": {"type": "string"},"height": {"type": "integer"}}}validate(json,jsonschema)

 

3.2最大值最小值

minimum maximum:指定数值的最小值和最大值。

min <= <= max

exclusiveMinimumexclusiveMaximum:指定数值必须严格大于或小于某个值(不包含等于)。

min < x < max

3.2.1minimum 、 maximum

from jsonschema import validatedef test2():json={"name": "zhangsan","age": 20}jsonschema = {"type": "object","properties": {"name": {"type": "string"},"age": {"type": "integer","minimum": 18,"maximum": 120}}}validate(instance=json,schema=jsonschema)

未成年报错:

3.2.2 exclusiveMinimum exclusiveMaximum

from jsonschema import validatedef test2():json={"name": "zhangsan","age": 18}jsonschema = {"type": "object","properties": {"name": {"type": "string"},"age": {"type": "integer","exclusiveMinimum": 18,"exclusiveMaximum": 20}}}validate(instance=json,schema=jsonschema)

 

3.3字符串特殊校验

pattern :使用正则表达式来验证字符串是否符合特定的模式。

正则表达式 – 语法 | 菜鸟教程

 

from jsonschema import validatedef test2():json={"name": "zhangsan","age": 19}jsonschema = {"type": "object","properties": {"name": {"type": "string","pattern": r"\S{4,20}"},"age": {"type": "integer","exclusiveMinimum": 18,"exclusiveMaximum": 20}}}validate(instance=json,schema=jsonschema)

 

3.4数据约束

关键字作用描述
minItems指定数组最小长度
maxItems指定数组最大长度
uniqueItems确保数组元素唯一
items定义数组元素的类型与约束

 

from jsonschema import validatedef test3():json= {"data": [1,2,3,4,5,5],"string": "pytest"}jsonschema= {"type": "object","required": [],"properties": {"data": {"type": "array",#对数组添加最小长度和最大长度"minItems": 1,"maxItems": 6,"uniqueItems": True,"items": {"type": "number"}},"string": {"type": "string"}}}validate(instance=json, schema=jsonschema)

 

3.5对象约束

关键字作用说明
minProperties指定对象的最小属性数量,即对象至少要有多少个属性
maxProperties指定对象的最大属性数量,即对象最多能有多少个属性
additionalProperties控制对象是否允许存在未在 properties 中定义的额外属性,默认值为 True

JSON Schema 默认不会对对象其他属性进行校验

from jsonschema import validatedef test_01():# JSON数据(字典结构,键值对形式)json_data = {"code": "SUCCESS","errMsg": "","data": False,#其他键"title": "测试"}# JSON Schema(用于校验json_data的结构)json_schema = {"type": "object","required": [],  # 可指定必须包含的字段,如 ["code", "errMsg"]"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "boolean"}}}validate(json_data, json_schema)

additionalProperties  

控制对象是否允许存在未在 properties 中定义的额外属性,默认值为 True

from jsonschema import validatedef test_01():# JSON数据(字典结构,键值对形式)json_data = {"code": "SUCCESS","errMsg": "","data": False,#其他键"title": "测试"}# JSON Schema(用于校验json_data的结构)json_schema = {"type": "object",#不允许有额外的字段"additionalProperties": False,"required": [],  # 可指定必须包含的字段,如 ["code", "errMsg"]"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "boolean"}}}validate(json_data, json_schema)

参数太多时,我们可以使用对应的网站:

在线JSON转Schema工具 - ToolTT在线工具箱

但是要注意二次检查,可能会出现错误。

嵌套的json对象:

 

def testblog_list():url="http://8.137.19.140:9090/blog/getList"hread = {"user_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc1NDczNTA5M30.cva2orifFbPsqSUlY9HJedF2hvIaRbXkMKqMOJTMx7o"}response = requests.get(url=url, headers=hread)print(response.json())json_schema={"type": "object","required": [],#additionalProperties 在哪里就限制哪一层级"additionalProperties": False,"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "array","items": {"type": "object","required": [],#additionalProperties 在哪里就限制哪一层级"additionalProperties": False,"properties": {"id": {"type": "number"},"title": {"type": "string"},"content": {"type": "string"},"userId": {"type": "number"},"deleteFlag": {"type": "string"},"createTime": {"type": "string"},"updateTime": {"type": "string"},"loginUser": {"type": "boolean"}}}}}}validate(json_schema, response.json())

minProperties、maxProperties


from jsonschema import validatedef test_01():# JSON数据(字典结构,键值对形式)json_data = {"code": "SUCCESS","errMsg": "","data": False,}# JSON Schema(用于校验json_data的结构)json_schema = {"type": "object",#最少一个属性,最多两个属性"minProperties": 1,"maxProperties": 2,#不允许有额外的字段"additionalProperties": False,"required": [],  # 可指定必须包含的字段,如 ["code", "errMsg"]"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "boolean"}}}validate(json_data, json_schema)

将属性个数设置为3

3.6必须属性

通过 required 关键字,JSON Schema 可以指定哪些属性是必需的。如果 JSON 实例中缺少这些必需属性,验证将失败(防止某些属性没有数据导致失败)。

例:

from jsonschema import validatedef test_01():# JSON数据(字典结构,键值对形式)json_data = {}# JSON Schema(用于校验json_data的结构)json_schema = {"type": "object","required": [],  # 可指定必须包含的字段,如 ["code", "errMsg"]"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "boolean"}}}validate(json_data, json_schema)

 

required  缺少 data 属性校验

from jsonschema import validatedef test_01():# JSON数据(字典结构,键值对形式)json_data = {"code": "SUCCESS","errMsg": "",}# JSON Schema(用于校验json_data的结构)json_schema = {"type": "object","required": ["code","errMsg","data"],  # 可指定必须包含的字段,如 ["code", "errMsg"]"properties": {"code": {"type": "string"},"errMsg": {"type": "string"},"data": {"type": "boolean"}}}validate(json_data, json_schema)

3.7依赖关系

dependentRequired 可以定义属性之间的依赖关系。

  • 当 JSON 实例里有 creditCard 属性时,必须同时包含 billingAddress 属性,不然验证不通过;
  • 要是没有 creditCard 属性,billingAddress 存在或不存在都可以

代码格式:

{"type": "object","properties": {"creditCard": {"type": "string"},"billingAddress": {"type": "string"}},"dependentRequired": {"creditCard": ["billingAddress"]}
}

示例:

缺少密码

def test04():json = {"username": "zhangsan",# "password": "123456","age": 18,"height": 175.8}jsonschema = {"type": "object","required": [],"properties": {"username": {"type": "string"},"password": {"type": "string"},"age": {"type": "number"},"height": {"type": "number"}},"dependentRequired": {"username": ["password"]}}validate(instance=json, schema=jsonschema)

缺少账号:

两者都没有:

4.总结

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918265.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918265.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918265.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端技术架构设计文档(Vue2+Antd+Sass)

前端技术架构设计文档&#xff08;Vue2AntdSass&#xff09; 文档信息项目名称前端系统&#xff08;基于 Vue2 技术栈&#xff09;技术栈核心Vue2 Ant Design Vue Sass版本号V1.0.0技术栈核心Vue2 Ant Design Vue Sass编制日期2025-08-071. 技术栈选型 1.1 核心技术框架类别…

【设计模式】抽象工厂模式 (工具(Kit)模式)

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;详解一、抽象工厂模式简介 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 是一种 创建型设计模式&#xff08;对象创建型模式&#xff09;&#xff0c;它提供了一种创建一系列相关或相互依赖对象…

Android初学者系统开发学习路线参考

Android初学者系统开发学习路线参考 文章目录Android初学者系统开发学习路线参考一、前言二、Android初学的学习计划第一阶段&#xff08;一个月&#xff09;UI相关学习&#xff1a;开发环境与 UI 基础&#xff0c;第一周&#xff1a;UI 控件与布局进阶&#xff0c;第二周&…

扩散LLM推理新范式:打破生成长度限制,实现动态自适应调节

随着 Gemini-Diffusion&#xff0c;Seed-Diffusion 等扩散大语言模型&#xff08;DLLM&#xff09;的发布&#xff0c;这一领域成为了工业界和学术界的热门方向。但是&#xff0c;当前 DLLM 存在着在推理时必须采用预设固定长度的限制&#xff0c;对于不同任务都需要专门调整才…

【ee类保研面试】其他类---计算机网络

25保研er&#xff0c;希望将自己的面试复习分享出来&#xff0c;供大家参考 part0—英语类 part1—通信类 part2—信号类 part3—高数类 part100—self项目准备 文章目录计算机网络知识点大全**计算机网络知识点总结**一、五层协议模型二、OSI七层模型补充三、TCP 与 UDP 及区别…

Python-机器学习(一)——特征工程

目录 特征工程 一、特征提取 1、字典特征提取 2、文本特征提取 2.1 英文文本提取 2.2 中文文本提取 3、TF-IDF文本特征词的重要程度特征提取 二、无量纲化-预处理 1 MinMaxScaler 归一化 2 normalize归一化 3 StandardScaler 标准化 三、特征降维 1、特征选择 1.…

谈谈SQL计算存储引擎中的索引和计算

背景 最近在这家公司做了一些事情&#xff0c;做的事情和以往的工作不太一样&#xff0c;不一样的点呢就是 之前我主要的工作是关注计算这方面&#xff0c;因为数据量大&#xff0c;研究的是怎么加速查询&#xff0c;怎么研究规则去优化&#xff0c;怎么去解规则的bug等等。因为…

vscode.window.activeTextEditor 获取不到 png 图片路径问题

vscode 的 extensions 插件开发时用 vscode.window.activeTextEditor?.document.uri 获取不到编辑器打开的图片路径&#xff0c;文档路径可以获取到。个人猜测因为图片不能编辑&#xff0c;所以没有 activeTextEditor 属性吧。解决办法&#xff1a;巧用右键获取路径和相对的路…

Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用(390)

Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用&#xff08;390&#xff09;引言&#xff1a;正文&#xff1a;一、传统手术机器人的 “黑箱困境”&#xff1a;记不全、算不清、追不到1.1 设备与临床的 “断层”1.1.1 数据记录 “太粗放”1.1.…

C++的结构体指针

结构体变量和结构体指针的区别特性结构体变量结构体指针存储内容结构体的实际数据内存地址内存开销结构体总大小固定4/8字节&#xff08;指针大小&#xff09;成员访问运算符.->函数传参时的行为值拷贝&#xff08;新副本&#xff09;地址传递&#xff08;操作原数据&#x…

pdf文件转word免费使用几个工具

在线工具&#xff08;无需安装&#xff09; Smallpdf ✅ 核心功能&#xff1a; 网页端直接操作&#xff0c;支持 PDF 与 Word 格式互转 免费用户每日限 2 次转换&#xff08;免注册&#xff09; 自动清除服务器文件&#xff0c;确保隐私安全 &#x1f517; 访问链接&#xff1a…

Vue3 组件化开发

文章目录前言组件化开发底部菜单 TabMenu父子组件相互传数据父传子&#xff1a;自定义属性子传父&#xff1a;自定义事件父子组件互传案例插槽 slot多个插槽总结组件化开发总结Vue组件的基本组成子组件使用的三个步骤父子组件相互传递数据前言 提示&#xff1a;这里可以添加本…

服务器硬件电路设计之I2C问答(二):I2C总线的传输速率与上拉电阻有什么关系?

I2C 总线传输速率与上拉电阻关系密切。上拉电阻阻值决定总线电平切换速度&#xff1a;电阻越小&#xff0c;充放电电流越大&#xff0c;信号边沿更陡&#xff0c;支持更高速率&#xff08;如 400kHz 快速模式&#xff09;&#xff1b;电阻过大则切换慢&#xff0c;限制速率&…

大语言模型提示工程与应用:LLMs文本生成与数据标注实践

提示词应用实践 学习目标 本课程通过LLMs生成情感分析样本和标注葡萄9品鉴数据&#xff0c;展示了其文本生成和数据标注能力。同时&#xff0c;利用PAL模型解决日期计算问题&#xff0c;学习了LLMs与编程运行时结合实现复杂推理的方法&#xff0c;为自然语言处理应用提供了实…

node.js 零基础入门

Node.js 零 基础入门与核心语法 适用对象&#xff1a;完全没接触过 Node.js 的同学 目标&#xff1a;从 0 到能写 CLI、小型 HTTP 服务、文件脚本、调用系统/网络资源 目录 什么是 Node.js安装与运行运行脚本与 REPL模块体系&#xff1a;CommonJS 与 ES Modules基础语法在 Node…

《Day3-PyTorch 自动微分入门:从计算图到梯度下降的实践指南》

八、自动微分自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。1. 基础概念张量Torch中一切皆为张量…

apache cgi测试

test.cgi #!/bin/sh echo "Content-type: text/html" echo "" echo "<h1>Hello from a Mac CGI script!</h1>" echo "<p>Current time is: $(date)</p>"ƒ% 放置目录 /opt/homebrew/Cellar/mapserver/8.4.0_1…

力扣 30 天 JavaScript 挑战 第二题笔记

这道题是涉及知识–闭包 1. 闭包定义以及相关知识点 官方定义为&#xff1a;在 JavaScript 中&#xff0c;函数具有对在相同作用域以及任何外部作用域中声明的所有变量的引用。这些作用域被称为函数的 词法环境。函数与其环境的组合被称为 闭包。 简单理解&#xff1a;内层函数…

OpenAI GPT-5 深度解析:API Key定价与ChatGPT(Free, Plus, Pro)用户的区别

前言&#xff1a;两年等待&#xff0c;只为这一跃 在科技圈长达两年的屏息期待与无尽猜想之后&#xff0c;2025年8月8日北京时间凌晨&#xff0c;OpenAI终于揭开了其新一代旗舰模型——GPT-5的神秘面纱。这不仅仅是一次常规的产品迭代&#xff0c;更被整个行业视为一块试金石&a…

ClickHouse集群部署实践---3分片2副本集群

ClickHouse集群部署实践—3分片2副本集群 未完待续。。。 喜欢的先点赞收藏&#xff01;&#xff01; 由于我们准备部署的是3分片2副本的集群&#xff0c;现在来解释一下配置参数的意思&#xff1a; shard标签代表分片的意思&#xff0c;如上图我们有3个分片&#xff0c;clickh…