JSON,是一种轻量级的数据交换格式,基本结构是“名称/值”对的集合,非常易于人阅读和编写,也易于机器解析和生成。

之前的文章,已介绍过C语言格式的cJSON库的使用,本篇来介绍与JSON紧密相关的JSON Schema。

1 问题引入

假设实际的项目中,我们使用json来描述一款产品的信息,该产品具有:

  • 标识符: productId
  • 商品名称: productName
  • 销售价格: price
  • 一组可选的标签:tags

用JSON表示,如下:

{"productId": 1,"productName": "A green door","price": 12.50,"tags": [ "home", "green" ]
}

看起来很简洁明了,但这种描述也留有一些问题,比如:

  • productId的含义是什么?
  • productName是必须的吗?
  • price可以为零吗?
  • tags都是字符串吗?

假如对于这里的JSON数据,我们随意赋予些不符合实际的数值,则会造成意外的影响。因此,就需要有一种规则来约束JSON数据的有效性,这就要通过JSON Schema来描述了。

2 JSON Schema

JSON Schema是一个提议的 IETF 标准,用于解决前面提到的数据格式的描述问题。JSON Schema本身使用的也是JSON数据格式

下面来看一下JSON Schema的基本语法

2.1 Schema的开头

我们从四个关键字的属性开始

  • $schema:用于指定JSON Schema版本信息,可以省略。注:该关键字若使用,其值必须使用官方提供的值,不能自己随便写。
  • $id: 定义了Schema的 URI,以及Schema内其他 URI 引用解析所依据的基本URI,可以省略
  • titledescription: 仅是描述性的。它们不会对正在验证的数据添加约束,可以省略
  • type: 验证JSON数据的第一个约束。此例子中,我们的JSON数据必须是一个JSON对象。

下面就是一个基本的JSON Schema:

{"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://example.com/product.schema.json","title": "Product","description": "A product in the catalog","type": "object"
}

从以上例子中,我们简单了解了JSON Schema开头的结构:

  • Schema关键字$schema$id
  • Schema注释titledescription
  • 验证关键字type

2.2 属性定义

type关键字描述了json数据的整体类型,那json数据内部元素如何描述呢,就要再借助properties关键字了。

再介绍一个required关键字,用来描述JSON数据中哪些关键字是必须的,例如productId是标识产品的唯一数值,是必需的。

将属性信息加入后的JSON Schema如下:

{"title": "Product","description": "A product from Acme's catalog","type": "object","properties": {"productId": {"description": "The unique identifier for a product","type": "integer"}},"required": [ "productId" ]
}

模仿对产品IDproductId的描述,继续来补充产品名称productName

productName也是必需的,它和productName之间实际上没有任何区别,因为计算机通常关注ID,而人类通常关注名称。注意required关键字是一个字符串数组,它可以记录多个值。

补充后的JSON Schema如下:

{"title": "Product","description": "A product from Acme's catalog","type": "object","properties": {"productId": {"description": "The unique identifier for a product","type": "integer"},"productName": {"description": "Name of the product","type": "string"}},"required": [ "productId", "productName" ]
}

此时,根据JSON Schema的描述,我们的JSON数据是这样:

{"productId": 1,"productName": "A green door"
}

2.3 深入了解属性

假设产品不是免费的,即price都是大于0,如何描述?

我们的JSON数据现在添加了price数据:

{"productId": 1,"productName": "A green door","price": 12.50
}

我们可以用exclusiveMinimum关键字来验证指定值的最小值。

price补充后的JSON Schema如下:

{"title": "Product","description": "A product from Acme's catalog","type": "object","properties": {"productId": {"description": "The unique identifier for a product","type": "integer"},"productName": {"description": "Name of the product","type": "string"},"price": {"description": "The price of the product","type": "number","exclusiveMinimum": 0}},"required": [ "productId", "productName", "price" ]
}

接下来,再来看一下tags关键字。假如这个产品有如下特性:

  • 如果有标签,则必须至少有一个标签,
  • 标签必须是文本。
  • 标签必须是唯一的,产品内无重复。
  • 标签不是必须要有的。

根据以上要求,有对应的Schema描述:

  • tagstype验证关键字为array,用minItems关键字来验证数组中最少的元素个数。
  • items关键字来定义数组中出现的内容。本例中,type验证关键字的值就是string
  • uniqueItems关键字来验证数组中的元素是相对彼此是唯一的。
  • 不把tags添加到required验证关键字数组中,表示它是可选的。

tag添加后的JSON Schema如下:

{"title": "Product","description": "A product from Acme's catalog","type": "object","properties": {"productId": {"description": "The unique identifier for a product","type": "integer"},"productName": {"description": "Name of the product","type": "string"},"price": {"description": "The price of the product","type": "number","exclusiveMinimum": 0},"tags": {"description": "Tags for the product","type": "array","items": {"type": "string"},"minItems": 1,"uniqueItems": true}},"required": [ "productId", "productName", "price" ]
}

此时,根据JSON Schema的描述,我们的JSON数据是这样:

{"productId": 1,"productName": "A green door","price": 12.50,"tags": [ "home", "green" ]
}

2.4 嵌套的数据结构

到目前为止,我们的JSON数据只有一个级别。

那多级的嵌套JSON数据(JSON数据内部的元素又是一个JSON对象),如何用JSON Schema描述呢?比如对该产品添加尺寸信息dimensions,它本身又是一个JSON对象:

{"productId": 1,"productName": "A green door","price": 12.50,"tags": [ "home", "green" ],"dimensions": {"length": 7.0,"width": 12.0,"height": 9.5}
}

对于嵌套的数据,则JSON Schema也继续进行对应的描述即可。

dimensions添加后的JSON Schema如下:

{"title": "Product","description": "A product from Acme's catalog","type": "object","properties": {"productId": {"description": "The unique identifier for a product","type": "integer"},"productName": {"description": "Name of the product","type": "string"},"price": {"description": "The price of the product","type": "number","exclusiveMinimum": 0},"tags": {"description": "Tags for the product","type": "array","items": {"type": "string"},"minItems": 1,"uniqueItems": true},"dimensions": {"type": "object","properties": {"length": {"type": "number"},"width": {"type": "number"},"height": {"type": "number"}},"required": [ "length", "width", "height" ]}},"required": [ "productId", "productName", "price" ]
}

注:为了简洁起见,例子中省略了对dimensionsdescription描述

3 使用Shema验证JSON格式

有许多在线的网站可以通过JSON Schema来验证JSON数据,比如这里: https://jsonschemalint.com/#/version/draft-07/markup/json

将本篇使用的JSON Schema复制到浏览器左边框中,JSON数据复制到右边框中,可以看到两个框都是绿色的,且右下角提示验证通过。

我们手动搞些错误出来,比如将JSON数据中的price字段删掉,则整个边框变红,下面提示缺少price。

再比如,将tags数组中增加一个重复的green标签,则也会进行错误提示。这些都是JSON Schema所起的实际作用。

4 总结

本篇主要介绍了三点:

  • JSON Schema与JSON的关系:JSON Schema是对JSON数据格式的一种描述。
  • JSON Schema的基本用法,通过一些常用的验证关键字来了解JSON Schema的用法:
    • titledescription: 仅是描述性的,可以省略
    • type: 验证JSON数据的类型
    • properties:描述JSON内部数据的具体属性
    • required:描述JSON数据中哪些关键字是必须的
    • exclusiveMinimum:验证指定值的最小值
    • minItems:验证数组中最少的元素个数
    • items:用来定义数组中出现的内容
    • uniqueItems:验证数组中的元素是相对彼此是唯一的。
  • 使用JSON Schema来验证对应的JSON数据是否符合要求。

JSON Schema基础入门相关推荐

  1. Json Schema快速入门

    Json Schema快速入门 JSON 模式是一种基于 JSON 格式定义 JSON 数据结构的规范.它被写在 IETF 草案下并于 2011 年到期.JSON 模式: 描述现有数据格式. 干净的人 ...

  2. json schema 关键字速查

    相关文章: [1] Understanding JSON Schema [2] Json Schema 快速入门 [3] Json Schema简介 1 引言 1.1 背景 json格式中提供如下A( ...

  3. json Schema 数据校验工具

    JSON Schema官网 文章目录 1:JSON Schema简介 1.1:基础知识 1.2:定义关键字解释 1:$schema 2:type支持数据类型 2.1:string字符串 1:正则表达式 ...

  4. json vue 对象转数组_vue 基础入门(一)修改

    vue基础入门(一) 1. 什么是vue Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标 ...

  5. Python json模块 - Python零基础入门教程

    目录 一.前言 二.python json 模块常用函数 三.json 转 Python 字典 dict 四.Python 字典 dict 转 json 五.关于 json.dump 和 json.l ...

  6. 视频教程-JSON基础入门实战讲解-JavaScript

    JSON基础入门实战讲解 04年进入计算机行业.拥有6年net和php项目开发经验,8年java项目开发经验. 现前端全栈工程师,主攻产品设计,微信开发等. 黄菊华 ¥39.00 立即订阅 扫码下载「 ...

  7. JSON基础入门实战讲解在线视频课程-JSON 使用 JavaScript 语法

    因为 JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON. 微信小程序交流群:111733917 | 微信小程序从0基础到就业的课程:http ...

  8. JSON基础入门实战讲解在线视频课程-JSON语法规则,json对象,json数组的定义和使用

    JSON 语法 微信小程序交流群:111733917 | 微信小程序从0基础到就业的课程:https://edu.csdn.net/topic/huangjuhua JSON 语法是 JavaScri ...

  9. JSON Schema入门和应用

    本文首发于:https://github.com/bigo-frontend/blog/ 欢迎关注.转载. JSON Schema入门和应用 何为JSON Schema? JSON数据格式对于web开 ...

最新文章

  1. 头秃元凶「真面目」首次被揭穿,鹅厂程序员立功了 | Nature子刊
  2. kafka 学习总结
  3. 什么浏览器好用_还在用手机自带浏览器么?这个不足1M的浏览器却功能更加强大...
  4. 新手必须掌握的学车技巧-上坡起步
  5. Linux删除文件和文件夹【命令】
  6. 2020魔幻“商战”:抢公章、发黄图、半夜翻工厂...最烂的小说都不敢这么写
  7. (日常搬砖)Linux常用指令记录(更新ing)
  8. 一元线性回归(R语言)
  9. CRM - 用户管理
  10. 基于51单片机的小区智能防盗门禁密码锁 proteus仿真程序设计
  11. 如何建立简易Rss源
  12. 杭电oj1052题:Tian Ji -- The Horse Racing
  13. skipnetworking mysql_MYSQL-skip-networking
  14. 《工程电磁场》学习笔记7-均匀传输线中的导行电磁波
  15. Alientek I.MX6UL Linux-第八章 汇编LED灯实验
  16. 鸿蒙起源轩辕厉害吗,风云雄霸天下中最强的武器“轩辕剑”为什么没人拿?
  17. 索尼7600gr中文说明书_独家正品索尼智能手环送APP
  18. 流浪地球:中国真正意义上的第一部硬科幻电影
  19. 计算机编程种常见的几种编码详解
  20. 全角英文和半角英文切换

热门文章

  1. 1106. 解析布尔表达式 DFS
  2. 如何有效激励经销商(中)
  3. 二手奢侈品回收鉴定估价小程序开发功能介绍
  4. 自学Python 58 Socket套接字编程 (一)
  5. 【go语言】如何给gin-swagger集成knife4j
  6. 访问学者如何为子女申请新加坡小学?
  7. Python opencv进行矩形识别
  8. 计算机应用基础案例教程习题答案,新编计算机应用基础案例教程上机指导与习题集(朱尽蓉)-习题答案...
  9. Github + Hexo 搭建个人博客超详细教程
  10. 转-走出软件作坊:三五个人十来条枪 如何成为开发正规军