当前位置: 首页 > news >正文

Linux-JSON Schema

目录

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.xdnf.cn/news/1266445.html

相关文章:

  • 大模型SSE流式输出技术
  • 【Python 高频 API 速学 ③】
  • 信息安全及防火墙总结
  • 【排序算法】②希尔排序
  • 束搜索(Beam Search):原理、演进与挑战
  • AI鉴伪技术:守护数字时代的真实性防线
  • PromptPilot打造高效AI提示词
  • llama-factory代码详解(一)--model_args.py
  • C++实现MATLAB矩阵计算程序
  • 【传奇开心果系列】Flet框架实现的功能丰富设计现代化的管理仪表盘组件自定义模板
  • 掌握长尾关键词SEO优化技巧
  • Redis 持久化策略深度剖析:从原理到实战,守护数据不丢失
  • axios 发请求
  • 制作浏览器CEFSharp133+X86+win7 之 javascript交互(二)
  • C++-AVL树
  • 词向量基础:从独热编码到分布式表示的演进
  • 微软将于 10 月停止混合 Exchange 中的共享 EWS 访问
  • Codeforces 思维训练(二)
  • [激光原理与应用-206]:光学器件 - SESAM - 基本结构与工作原理
  • 爬虫攻防战:反爬与反反爬全解析
  • 跨境电商系统开发:ZKmall开源商城的技术选型与代码规范实践
  • sqli-labs通关笔记-第40关 GET字符型堆叠注入(单引号括号闭合 手工注入+脚本注入两种方法)
  • 多级缓存详解
  • 【能碳建设1】用AI+开源打造物联网+能碳管理+交易SaaS系统的最短路径实施指南
  • 软件定义车辆加速推进汽车电子技术
  • 快速使用selenium+java案例
  • [Linux]学习笔记系列 -- [arm][lds]
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)
  • 前端工程化:从构建工具到性能监控的全流程实践
  • 2G内存的服务器用宝塔安装php的fileinfo拓展时总是卡死无法安装成功的解决办法