JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录

  • 一、引言
  • 二、什么是 JSON Schema?
  • 三、JSON Schema 的基本结构
    • 3.1 基本关键字
    • 3.2 对象属性
    • 3.3 数组元素
    • 3.4 字符串约束
    • 3.5 数值约束
  • 四、示例:定义一个简单的 JSON Schema
  • 五、使用 JSON Schema 进行验证
  • 六、实战效果
    • 6.1 如何使用
  • 七、总结


一、引言

在现代的 Web 开发和数据交换中,JSON(JavaScript Object Notation)已经成为了一种非常流行的数据格式。它轻量、易读、易于解析,广泛应用于 API 通信、配置文件、数据存储等场景。然而,随着 JSON 数据结构的复杂性增加,如何确保 JSON 数据的有效性和一致性成为了一个挑战。这时,JSON Schema 就派上了用场。

本文将带你入门 JSON Schema,帮助你理解它的基本概念、语法结构,并通过实例演示如何使用 JSON Schema 来定义和验证 JSON 数据结构。

在这里插入图片描述

二、什么是 JSON Schema?

JSON Schema 是一种用于描述 JSON 数据结构的规范。它允许你定义 JSON 数据的格式、类型、约束条件等,从而确保 JSON 数据符合预期的结构。通过 JSON Schema,你可以在数据交换、存储或处理之前,对 JSON 数据进行验证,确保其有效性和一致性。

简单来说,JSON Schema 就像是 JSON 数据的“蓝图”或“合同”,它规定了 JSON数据应该长什么样子。

三、JSON Schema 的基本结构

一个 JSON Schema 本身也是一个 JSON 对象。它由一系列关键字(keywords)组成,这些关键字用于定义 JSON 数据的结构和约束条件。

3.1 基本关键字

  • $schema: 指定使用的 JSON Schema 版本。例如,"$schema": "http://json-schema.org/draft-07/schema#" 表示使用 Draft 7 版本的 JSON Schema。
  • $id: 为 Schema 定义一个唯一的标识符,通常是一个 URL。
  • titledescription: 分别为 Schema 提供标题和描述信息,便于理解和维护。
  • type: 定义 JSON 数据的类型。常见的类型有 object、array、string、number、integer、booleannull

3.2 对象属性

  • properties: 定义对象中的各个属性及其对应的 Schema。
  • required: 指定哪些属性是必须的。
  • additionalProperties: 控制是否允许对象包含未在 properties 中定义的额外属性。

3.3 数组元素

  • items: 定义数组中每个元素的 Schema。
  • minItemsmaxItems: 分别指定数组的最小和最大长度。
  • uniqueItems: 指定数组中的元素是否必须唯一。

3.4 字符串约束

  • minLength 和 maxLength: 分别指定字符串的最小和最大长度。
  • pattern: 使用正则表达式约束字符串的格式。
  • format: 指定字符串的格式,如 email、date-time 等。

3.5 数值约束

  • minimum 和 maximum: 分别指定数值的最小和最大值。
  • exclusiveMinimumexclusiveMaximum: 指定数值是否排除最小值和最大值。
  • multipleOf: 指定数值必须是某个数的倍数。

四、示例:定义一个简单的 JSON Schema

假设我们要定义一个表示用户信息的 JSON 数据结构,要求如下:

  • 用户对象必须包含 idnameemail 属性。
  • id 必须是整数。
  • name 必须是字符串,且长度在 1 到 50 之间。
  • email 必须是有效的电子邮件地址。
  • 用户对象可以包含可选的 age 属性,且必须是正整数。

对应的 JSON Schema 可以这样定义:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com/user.schema.json",
  "title": "User",
  "description": "A user object",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 50
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "exclusiveMinimum": true
    }
  },
  "required": ["id", "name", "email"],
  "additionalProperties": false
}

解释

  • $schema$id 分别指定了 Schema 的版本和唯一标识符。
  • type 指定了 JSON 数据的类型为 object
  • properties 定义了对象的各个属性及其约束条件。
  • required 指定了 idnameemail 是必须的属性。
  • additionalProperties 设置为 false,表示不允许对象包含未定义的属性。

五、使用 JSON Schema 进行验证

定义好 JSON Schema 后,我们可以使用各种工具和库来验证 JSON 数据是否符合该 Schema。以下是一些常用的验证工具:

  • JavaScript: 可以使用 Ajv 库进行验证。
  • Python: 可以使用 jsonschema 库进行验证。
  • 在线工具: 可以使用 JSON Schema Validator 在线验证 JSON 数据。

示例:使用 Ajv 进行验证
假设我们有以下 JSON 数据:

 
{
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com",
  "age": 30
}

我们可以使用 Ajv 来验证该数据是否符合我们定义的 Schema


const Ajv = require('ajv');
const ajv = new Ajv();

const schema = {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com/user.schema.json",
  "title": "User",
  "description": "A user object",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 50
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "exclusiveMinimum": true
    }
  },
  "required": ["id", "name", "email"],
  "additionalProperties": false
};

const data = {
  "id": 1,
  "name": "John Doe",
  "email": "john.doe@example.com",
  "age": 30
};

const validate = ajv.compile(schema);
const valid = validate(data);

if (valid) {
  console.log('数据有效');
} else {
  console.log('数据无效:', validate.errors);
}

如果数据符合 Schema,输出将是 数据有效;否则,输出将是 数据无效 并显示具体的错误信息。

六、实战效果

我们以 Furion 框架为例,Furion 框架提供了完整的 FurionASP.NET CoreJSON Schema 文件,通过该文件可以在编写配置文件时提供完整的智能提示和校验。

6.1 如何使用

使用方式非常简单,只需要在 .json 文件的头部添加 "$schema":"https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", 即可,
如:

{
  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",

  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore": "Information",
      "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
    }
  },
  "AllowedHosts": "*"
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
怎么样,这会知道好处了把!!

七、总结

JSON Schema 是一种强大的工具,可以帮助你定义和验证 JSON 数据的结构。通过使用 JSON Schema,你可以确保 JSON 数据的有效性和一致性,减少数据错误和异常情况的发生。本文介绍了 JSON Schema 的基本概念、语法结构,并通过实例演示了如何定义和使用 JSON Schema

希望这篇入门指南能帮助你更好地理解和使用 JSON Schema。如果你有更多问题或需要进一步的帮助,欢迎在评论区留言讨论!


参考资料:

  • JSON Schema 官方文档
  • Ajv 文档
  • JSON Schema Validator

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980467.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初探Ollama与deepseek

什么是Ollama?它与大模型有什么联系? 简单说,Ollama就像是你电脑上的一个 “大模型小助手”。 以前,很多强大的大语言模型,比如能回答各种问题、写文章、翻译等的那些模型,要么只能在网上的服务器上用&am…

【word】保存重开题注/交叉引用消失,全局更新域问题

目录 一、更新域是什么二、更新域常见问题及解决方法(一)更新域后内容未变化(二)域代码显示异常(三)交叉引用无法更新(四)全选更新域出现错误 三、交叉引用与题注的关系及操作&#…

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石,它像区块链世界的身份证和防伪标签,确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言,带你彻底搞懂区块链中的数字签名! 文章目录 1. 数字签名是什么?从现实世界到区块…

人工智能之数学基础:矩阵的范数

本文重点 在前面课程中,我们学习了向量的范数,在矩阵中也有范数,本文来学习一下。矩阵的范数对于分析线性映射函数的特性有重要的作用。 矩阵范数的本质 矩阵范数是一种映射,它将一个矩阵映射到一个非负实数。 矩阵的范数 前面我们学习了向量的范数,只有当满足几个条…

【MySQL】数据库初识

目录 一、什么是数据库 与数据结构的区别 各类软件(数据库)代表 关系型 vs 非关系型 关系型数据库 非关系型数据库 二、初识MySQL数据库 三、MySQL数据库安装 四、常用数据类型 内存 vs 硬盘 数值类型 字符串类型 日期类型 五、MySQL数据库…

Minio文件存储及Springboot集成

文章目录 Minio简介Minio安装使用下载Minio.exe启动访问WebUI MinIO基本概念Spingboot集成Minio设置本地Minio访问秘钥创建文件存储bucket项目pom.xml添加依赖配置文件修改Minio配置类Minio工具类定义HttpStatus定义统一返回结果定义controller类 总结 Minio简介 MinIO 是高性…

P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用

P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环,完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值,在不同的年份中应该更新2月的值 还有…

蓝桥杯练习代码

一、最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1: 输入:nums [-1,2,1,-4], targe…

Go中slice和map引用传递误区

背景 关于slice和map是指传递还是引用传递,很多文章都分析得模棱两可,其实在Go中只有值传递,但是很多情况下是因为分不清slice和map的底层实现,所以导致很多人在这一块产生疑惑,下面通过代码案例分析slice和map到底是…

DeepSeek如何快速开发PDF转Word软件

一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的PDF转Word工具有收费的WPS,免费的有PDFGear,以及在线工具SmallPDF、iLovePDF、24PDF等。然而,大多数免费在线转换工具存在严重隐私风险——文件需上…

perf(es5-widget): es5-widget.js文件优化时间戳生成逻辑

这个文件内部分代码逻辑推荐语法: cacheVersion widgetcfg.versionif (cacheVersion "time") {cacheVersion Date.now ? Date.now() : new Date().getTime(); } 改善优化 后续更新对应代码行 perf(es5-widget): 优化时间戳生成逻辑 将 "&quo…

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有…

Android 应用开发中,证书、签名和加固简述

目录 一、应用证书(Digital Certificate) 二、应用签名(APK Signing) 三、应用加固(Obfuscation & Protection) 三者的关系与协同 实际应用场景 总结 四、V1、V2、V3 签名方案的区别 1. V1 签名…

SpringMVC学习(初识与复习Web程序的工作流程)(1)

目录 一、SpringMVC(框架)的简要概述。 &#xff08;1&#xff09;SpringMVC与Servlet。 &#xff08;2&#xff09;技术方向。 &#xff08;3&#xff09;最终学习目标。 二、Web程序的基本工作流程。 &#xff08;1&#xff09;工作流程。 <1>浏览器。前后端任务。 <…

yunedit-post ,api测试比postman更好

postman应该是大家最熟悉的api测试软件了&#xff0c;但是由于它是外国软件&#xff0c;使用它的高端功能注册和缴费都比较麻烦。生成在线文档分享也经常无法访问被拦截掉。 这里可以推荐一下yunedit-post&#xff0c;该有的功能都有。 https://www.yunedit.com/postdetail …

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

基因枷锁下的太空梦 —— 千钧一发电影观后感

目录 1 人物介绍 2 电影名解读 3 电影开头 3.1 电影开头的两段话 3.2 片头设计 4 电影正文 4.1 “杰罗米”各种诡异的行为 4.2 文森特 – 失败的man 4.3 真正的杰罗米以及假基因身份证 4.4 文森特新征程 4.5 基因人的不容易 4.6 睫毛被查出有问题 4.7 文森特身份初…

RustDesk搭建公网中继服务器远控内网机器(完整版)

前情提要&#xff1a;最近要在学校实验室的服务器&#xff08;ubuntu&#xff09;上做实验&#xff0c;但是服务器在校园网里面&#xff0c;在外面的时候没法远控&#xff0c;todesk有时候有点卡顿&#xff0c;所以想试着用rustdesk进行远程控制。 参考博客&#xff1a; 官方…

Java Web-Filter

Filter 在 Java Web 开发中&#xff0c;Filter&#xff08;过滤器&#xff09;是 Servlet 规范中的一个重要组件&#xff0c;它可以对客户端与服务器之间的请求和响应进行预处理和后处理。以下从多个方面详细介绍 Java Web 中的 Filter&#xff1a; 一、概念和作用 概念&…

水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)

使用说明 代码下载&#xff1a;BP神经网络水果识别系统&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神经网络水果识别系统 一、引言 1.1、研究背景及意义 在当今科技迅速发展的背景下&#xff0c;人工智能技术尤其是在图像识别领域的应用日益广泛。水果识别作为…