Json Schema

JSON Schema是一种基于JSON格式的规范,用于定义和校验JSON数据结构。本文介绍了JSON Schema的基本概念,包括常见关键字如`type`,`$schema`,`title`和`description`的用法,并提供了代码示例展示如何使用JSON Schema进行数据验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言

什么是Json Schema

JSON Schema是基于JSON格式,用于定义JSON数据结构以及校验JSON数据内容。

假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友。一个请求的例子如下:

{
    "city" : "chicago", 
    "number": 20, 
    "user" : {
        "name":"Alex", 
        "age":20
        }
}

在上面的例子中,web api要求提供city,number,user三个成员,其中city是字符串,number是数值,user是一个对象,又包含了name和age两个成员。

对于api来说,需要定义什么样的请求合法,即什么样的Json对于api来说是合法的输入。这个规范可以通过Json Schema来描述,对应的Json Schema如下

{ 
    "type": "object",
    "properties": {
        "city": { "type": "string" },
        "number": { "type": "number" },
        "user": { 
            "type": "object",
            "properties": {
                "name" : {"type": "string"},
                "age" : {"type": "number"}
            }                       
        }
    }
}

例子可以使用https://www.jsonschemavalidator.net/来验证

JSON Schema中比较常见的关键字如下:

在这里插入图片描述

type取值

在这里插入图片描述

在线jsonschema 转换:https://jsonschema.net/#/

之前验证接口的代码为:

import requests

#查询发布会接口
url = "http://127.0.0.1:8000/api/get_event_list/"

r = requests.get(url, params={'eid':'1'})
 result = r.json()
 print(result)
 assert result['status'] == 200
 assert result['message'] == "success"
 assert result['data']['name'] == "锤子手机发布会"
 assert result['data']['address'] == "成都"
 assert result['data']['start_time'] == "2017-11-21T15:25:19"

使用schame校验

  1. 导入包
  2. 申明一个Schame
  3. 调用Valid函数,如果得到的值不出错,则运行时不会抛出异常。

代码如下:

如下带有token的校验,由于token的值不固定,它是一个30位长度的16进制,0-9和a-f生成的字符串,可以用正则匹配

from jsonschema import validate
 
# 需要校验的内容
result = {
    "code": 0,
    "msg": "login success!",
    "token": "000038efc7edc7438d781b0775eeaa009cb64865",
    "username": "test"
}
 
 
# 编写schema 内容
#下面是给json定义一个规范,也就是json中每个key的value值的数据类型,长度或使用正则校验起始或结尾的字符等
schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "test demo",
    "description": "validate result information",
    "type": "object",
    "properties": {
        "code": {
            "description": "error code",
            "type": "integer"
        },
        "msg": {
            "description": "error msg ",
            "type": "string"
        },
        "token":
        {
            "description": "login success return token",
            "maxLength": 30,#长度
            "pattern": "^[a-f0-9]{40}$",  # 正则校验a-f0-9的16进制,总长度40
            "type": "string"#类型
        }
    },
    "required": [
        "code", "msg", "token"
    ]
}
1
assert(instance=result, schema=schema)#result要校验的数据,schema规范
validate(inputvalues,schema=myschema)

validate() 函数将首先验证所提供的模式本身是否有效,因为不这样做会导致不太明显的错误消息,并以不太明显或一致的方式失败。然后再验证json数据。
如果JSON数据实例是无效的,则抛出 jsonschema.exceptions.ValidationError 异常
如果schema模式本身是无效的,则抛出 jsonschema.exceptions.SchemaError 异常

关键字详细解释:

$schema

该关键字用于指定JSON Schema版本信息,该关键字是可以省略的,当前最新版本为draft-07。注意:该关键字的值必须使用官方提供的值,不能自己随便写。

title和description

这两个关键字都是用来描述对应的JSON元素的,唯一的区别在于,title相对来说,更加简洁,而description更加倾向于详细描述相关信息。当然了,这两个关键字都是可以省略的。

type

该关键字用于限定待校验JSON元素所属的数据类型,例一中最外层的type关键字值为object,即表示待校验JSON数据为一个JSON对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值