【Python】Json Schema的使用【原创】

本文介绍了Json Schema作为JSON数据结构和内容校验工具的背景、概述及使用方法,特别是在Python中的应用。通过定义JSON Schema,可以对复杂的数据进行严格校验,如在部署容器时对deployment.yaml的验证。文章还给出了Python中使用jsonschema库进行校验的步骤,并举了一个kubernetes deployment的校验例子。
摘要由CSDN通过智能技术生成

一. 背景

之前在做容器发布系统的时候,在部署时需要对提交的deployment.yaml进行校验,而由于deployment.yaml虽然可以解析为Json,但在面对很多的参数校验时候进行如下的校验就显得力不从心了:

aaa = request.get('aaa', '')
if not aaa:
    return False, 'aaa不能为空'

bbb = request.get('bbb', 0)
if not bbb:
    return False, 'bbb不能为空'

if bbb > 10 or bbb < 1:
    return False, 'bbb必须在1-10之间'

这个时候就在找能够处理大量参数校验的方法或者是可用的库,而Json Schema就刚好比较符合。

二、概述

Json Schema是基于Json格式、用于定义Json数据结构以及校验Json数据内容的工具,官方文档提供了比较多的例子,比如Json Schema提供了anyOf、allOf、oneOf、not等组合规则来进行严格的校验规则。


首先需要来了解一下Json的数据类型:

# 对象,object
{
   "key1": "value1", "key2": 22}

# 数组/列表,array
["first", "second", "third"]

# 数字,number
42
3.1415

# 字符串,string
"Hello World"

# 布尔值,boolean
true
false

# null值,null
null

比如一个json格式的例子:

{
   
 "fruits": ["apple", "orange", "pear"],
 "vegetables": [
   {
   
     "veggieName": "potato",
     "veggieLike": true
   },
   {
   
     "veggieName": "broccoli",
     "veggieLike": false
   }
 ]
}

三、介绍

JSON Schema定义了JSON格式的规范,各种语言都有开源的第三方JSON Schema校验库,例如Go语言的gojsonschema,Python的jsonschema等。


这样我们就可以定义一份JSON Schema,然后系统的各个模块都可以复用这套JSON规范,不满足规则的数据JSON Schema会直接报错。


目前最新的Json Schema版本为draft 8,发布于2019年9月。


JSON Schema作为JSON的规范样式,自身也有一套key-value语法用于声明各种规则。


Json Schema中常见关键字有:

关键字 描述
$schema 表示该JSON Schema文件遵循的规范和使用的版本,可以不包含,注意:不同版本间不完全兼容
$id 当前schema的唯一id标识,一般指向一个自主域名。方便后续引用,可以不包含
title 为该JSON Schema文件提供一个标题,可不包含
description 关于该JSON Schema文件的描述信息,可不包含
type 表示待校验元素的类型,例如,最外层的type表示待校验的是一个JSON对象(object)
内层type表示待校验的元素类型有:整数(integer),字符串(string),数字(number),布尔值(boolean)、对象(object)、数组(array)、null
properties 说明该JSON对象有哪些属性/字段
enum 枚举类型,比如只能在这几种:[“red”, “amber”, “green”]
required 必须存在的字段
minimum 用于约束取值范围,表示取值范围应该大于或等于minimum
exclusiveMinimum 如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表示取值范围只能大于minimum
maximum 用于约束取值范围,表示取值范围应该小于或等于maximum
exclusiveMaximum 如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表示取值范围只能小于maximum
multipleOf 用于约束取值,表示取值必须能够被multipleOf所指定的值整除
maxLength/minLength 字符串类型数据的最大/最小长度
dependencies 字段的依赖关系,比如:
{
“type”:“object”,
 “properties”:{
   “name”:{“type”:“string”},
   “age”:{“type”:“number”}
},
“dependencies”:{ “gender”:[“age”] } }
表示:gender是依赖于age存在的,age字段不存在但存在gender字段是会报错的
pattern 使用正则表达式约束字符串类型数据,比如:^(\([0-9]{3}\))?[0-9]{3}-[0-9]{4}$
multipleOf 倍数,比如{ “type”: “number”, “multipleOf”: 5 }表示:字段必须是5的倍数
not 取反,比如:{ “not”: { “type”: “string” } },非字符串
array 数组
oneof 满足其中一个,比如:{
“oneOf”: [
  { “type”: “number”, “multipleOf”: 5 },
  { “type”: “number”, “multipleOf”: 3 }
]
}
表示要么是5的倍数,要么是3的倍数
allof 都要满足,用法类似上面的oneof
uniqueItems 在数组里面的,布尔值,表示数组元素是否唯一
minProperties/maxProperties 在object里面的,表示object里面的最小/最大的字段个数
maxItems/minItems 表示数组里面的元素最大/最小个数
minLength/maxLength 字符串类型数据的最小/最大长度

官网一个示例来进行介绍:

{
   
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/product.schema.json",
  "title": "Product",
  "description": "A product from Acme's catalog"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值