探索JSON Schema的世界

embedded/2024/9/24 13:18:09/

在职场中,若你频繁与JSON数据打交道,并致力于保障数据准确性与统一性,那么你不妨探究一下这款工具。

JSON Schema是一种描述JSON数据结构的格式。就像你填写表格时,表格上会告诉你每个空格应该填什么类型的信息,比如姓名、电话号码或者邮箱地址,JSON Schema就是用来告诉计算机,一个JSON文件中每个字段应该包含什么样的数据。

用小白话来说,可以把JSON Schema想象成一种“数据的说明书”。它规定了数据的结构,比如哪些信息是必须填的,哪些信息是可以选填的,每个信息应该是数字、字符串还是其他什么类型,甚至还可以规定字符串的格式(比如电子邮件地址或电话号码的格式)。

这样,当你在处理数据的时候,JSON Schema就能帮你检查数据是否符合预期的格式,确保数据的准确性和一致性。

JSON Schema可以用来验证多种类型的数据,主要包括以下几种:

  1. 字符串(String):可以规定字符串的长度、格式(如电子邮件、URL、日期等)以及是否包含某些特定的字符。

  2. 数字(Number):可以验证整数或浮点数,包括它们的范围(最小值、最大值)、是否为多位数值、是否为特定的倍数等。

  3. 整数(Integer):与数字类似,但专门用于整数的验证。

  4. 布尔值(Boolean):用来验证数据是否为真或假。

  5. 数组(Array):可以验证数组的长度、包含的元素类型、元素数量以及数组中元素的特定顺序。

  6. 对象(Object):用来验证JSON对象的结构,包括对象中应该有哪些字段,每个字段的数据类型,以及字段之间的关系。

  7. null:用来验证数据是否为null。

  8. 枚举(Enum):可以指定一个字段只能包含一组预定义的值中的一个。

  9. 组合类型:可以组合上述类型,比如一个字段可以是字符串或数字,或者一个字段可以是对象或null。

  10. 格式验证:可以对特定字段应用格式验证,比如日期时间、电子邮件地址、IP地址等。

  11. 依赖关系:可以定义字段之间的依赖关系,比如某个字段的存在依赖于另一个字段的值。

  12. 默认值:可以为字段指定默认值。

  13. 示例:可以为字段提供一个示例值,虽然这不会影响验证,但有助于文档化。

通过这些类型的验证,JSON Schema 帮助确保数据的准确性和有效性,使得数据交换更加可靠

JSON Schema 在实际应用中的常见使用场景包括:

  1. API 接口数据校验:在前后端分离的开发模式中,JSON Schema 可以用来校验 API 接口的数据,确保传入的数据符合预期的格式和类型,提高接口的健壮性。

  2. 配置文件验证:用于验证配置文件中的 JSON 数据,确保配置的正确性和一致性。

  3. 表单验证:在 web 表单或移动应用表单中,JSON Schema 可以用来定义表单字段的规则,如必填项、数据类型、长度限制等,提高数据的准确性。

  4. 自动化测试:在自动化测试中,JSON Schema 可以用来验证测试数据,确保测试用例的数据符合预定的格式。

  5. 数据交换:在不同系统或服务之间进行数据交换时,使用 JSON Schema 可以确保数据的兼容性和一致性。

  6. 生成文档和代码JSON Schema 可以用于生成 API 文档、数据模型和代码,提高开发效率。

  7. 低代码平台:在低代码或无代码平台中,JSON Schema 可以用来定义用户界面组件的属性和行为,实现可视化编程。

  8. 数据修复:某些 JSON Schema 库支持自动修复不合规的数据,使其符合预定的模式。

  9. Mock 数据生成:基于 JSON Schema 生成模拟数据,用于开发和测试阶段。

  10. 数据迁移:在系统迁移过程中,使用 JSON Schema 验证数据,确保迁移后的数据符合新系统的要求。

简单的JSON Schema实例

让我们通过一个简单的实例来说明如何使用 JSON Schema 来定义和校验 JSON 数据。假设我们正在开发一个用户管理系统,需要定义一个 API 来创建新用户,用户的信息包括用户名、邮箱和年龄。我们将使用 JSON Schema 来确保客户端发送的数据符合我们的预期格式。

步骤 1: 定义 JSON Schema

首先,我们需要定义一个 JSON Schema 来描述用户信息的数据结构:

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "用户信息",
  "description": "用于创建新用户的用户信息",
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "minLength": 3,
      "maxLength": 20
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "age": {
      "type": "integer",
      "minimum": 18,
      "maximum": 100
    }
  },
  "required": ["username", "email"]
}
```

这个 JSON Schema 定义了以下规则:
- 数据类型为对象(`"type": "object"`)。
- 包含三个属性:`username`、`email` 和 `age`。
- `username` 必须是长度在 3 到 20 之间的字符串。
- `email` 必须是有效的邮箱格式。
- `age` 必须是 18 到 100 之间的整数。
- `username` 和 `email` 是必填字段。

步骤 2: 使用 JSON Schema 校验数据

假设客户端发送了以下 JSON 数据到服务器:

```json
{
  "username": "john_doe",
  "email": "john.doe@example.com",
  "age": 25
}
```

服务器端可以使用 JSON Schema 验证器来检查这个 JSON 数据是否符合我们定义的模式。如果数据不符合,验证器将返回错误信息。

步骤 3: 验证结果

使用上述 JSON Schema,验证器会检查:
- `username` 是否为字符串且长度符合要求。
- `email` 是否为有效的邮箱格式。
- `age` 是否为 18 到 100 之间的整数。
- 确保 `username` 和 `email` 字段存在。

如果所有检查都通过,那么这个 JSON 数据被认为是有效的,服务器可以继续处理这个请求。如果有任何一项不符合,验证器将拒绝这个请求并返回错误信息,例如:

- 如果 `email` 字段不是有效的邮箱格式,验证器可能会返回:“`email` 属性不是有效的邮箱格式。”
- 如果缺少 `username` 字段,验证器可能会返回:“缺少必需的属性 `username`。”

步骤 4: 错误处理

根据验证结果,服务器可以决定是否接受请求或返回错误响应给客户端,错误响应可能包含验证失败的原因,帮助客户端开发者理解问题所在并进行修正。

在 FastAPI 中,你可以利用其内置的支持来使用 JSON Schema 进行数据验证。

FastAPI 会自动将 Pydantic 模型的验证逻辑转换为 JSON Schema,这意味着你可以直接在路由函数中使用 Pydantic 模型来自动进行请求数据的验证。

步骤 1: 安装 FastAPI 和 Uvicorn

首先,你需要安装 FastAPI 和 Uvicorn(一个轻量级的 ASGI 服务器),如果还没有安装的话:

pip install fastapi uvicorn

步骤 2: 创建 FastAPI 应用

接下来,创建一个 Python 文件,比如 main.py,并编写以下代码:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, EmailStr
from fastapi.responses import JSONResponseapp = FastAPI()class User(BaseModel):username: stremail: EmailStrage: int# 你可以在这里添加额外的验证逻辑# 比如检查用户名的长度,或者年龄的范围@propertydef is_valid_username(self) -> bool:return 3 <= len(self.username) <= 20@propertydef is_valid_age(self) -> bool:return 18 <= self.age <= 100@app.post("/users/")
async def create_user(user: User):if not user.is_valid_username:return JSONResponse(status_code=400, content={"message": "无效的用户名"})if not user.is_valid_age:return JSONResponse(status_code=400, content={"message": "年龄必须在18到100之间"})# 正常情况下,你可以在这里处理用户创建逻辑return JSONResponse(status_code=200, content={"message": "用户创建成功", "user": user.dict()})# 用于测试的额外路由
@app.get("/")
async def read_root():return {"message": "Hello World"}

步骤 3: 运行 FastAPI 应用

使用以下命令来启动服务器:

uvicorn main:app --reload

步骤 4: 测试 API

现在,你的 FastAPI 应用应该在 http://127.0.0.1:8000 上运行。你可以使用工具如 Postman 或者直接使用 curl 来测试它:

curl -X 'POST' \'http://127.0.0.1:8000/users/' \-H 'accept: application/json' \-H 'Content-Type: application/json' \-d '{"username": "john_doe","email": "john.doe@example.com","age": 25
}'

如果发送的数据不符合模型定义(比如 username 不在 3 到 20 个字符之间,或者 age 不在 18 到 100 之间),FastAPI 会自动返回一个 422 Unprocessable Entity 错误,并且告诉你哪些字段验证失败。


http://www.ppmy.cn/embedded/103870.html

相关文章

【电力电子】单相并网逆变器

摘要 单相并网逆变器是一种将直流电转换为单相交流电&#xff0c;并与电网同步输出的装置。它广泛应用于小型可再生能源系统&#xff0c;如光伏发电&#xff0c;确保产生的电能能够高效、安全地并入电网。本文探讨了单相并网逆变器的设计理论、控制策略以及其在不同负载条件下…

Metasploit漏洞利用系列(十):MSF渗透测试 - 震网三代(远程快捷方式漏洞)实战

在本系列的第十篇中&#xff0c;我们将深入探讨如何利用Metasploit Framework (MSF) 来利用著名的震网三代&#xff08;Stuxnet三代&#xff09;中的一个远程快捷方式漏洞&#xff08;LNK漏洞&#xff09;。虽然“震网三代”并非官方术语&#xff0c;而是为了描述一个类似震网蠕…

SAST :静态应用程序安全测试

目录 什么是 SAST&#xff1f; 为什么我们需要 SAST&#xff1f; SAST 解决了哪些问题&#xff1f; SAST 如何工作&#xff1f; 揭秘 SAST、DAST、IAST 和 RASP SAST 和 DAST 有什么区别&#xff1f; 典型的 SAST 优势 下一代 SAST 的增强优势 SAST的优缺点 传统 SA…

LTE 辅同步信号SSS介绍,MATLAB实现

LTE通信系统中&#xff0c;UE要想完成初始的小区搜索&#xff0c;在检测完PSS之后要检测SSS&#xff0c;因为PSS完成后只获得了5ms定时和NID2&#xff0c;大家都知道完整的PCI是由NID1和NID2组成的&#xff0c;而NID1的信息在SSS中&#xff0c;还需要获取10ms定时&#xff0c;以…

【IEEE独立出版 | 往届快至会后2个月检索】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024,9月27-29)

2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机学院、长春理工大学人工智能学院承办&#xff0c;多…

HDMI显示器驱动设计与验证

1 HDMI简介 在此附上HDMI协议的数据手册链接&#xff0c;更有1.4的中文版&#xff1a; https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7aVQ?pwd6666https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7aVQ?pwd6666链接&#xff1a;https://pan.baidu.com/s/1CdEQuJzYXnESNZK60k7a…

MySQL-进阶篇-SQL优化(插入数据优化、主键优化、order by优化、group by优化、limit优化、count优化、update优化)

文章目录 1. 插入数据优化1.1 使用批量插入1.2 批量插入数据时手动提交事务1.3 按主键的顺序插入1.4 大批量插入数据时使用 load 指令 2. 主键优化2.1 数据组织方式2.2 页分裂2.3 页合并2.4 主键的设计原则2.4.1 降低主键的长度2.4.2 使用 AUTO_INCREMENT 自增主键2.4.3 尽量不…

fpga图像处理实战-均值滤波

均值滤波 均值滤波是一种简单的图像处理技术,主要用于平滑图像,去除噪声。它通过用当前像素邻域的平均值代替该像素值,从而实现图像的平滑处理。这种滤波器在图像处理中被广泛用于减少图像中的随机噪声。 算法原理 均值滤波的基本思想是使用一个固定大小的滑动窗口(通常为…