3 分钟了解 JSON Schema
大家好,我不是鱼皮。
幸运又不幸,我是一名程序员,他也是一名程序员。
周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 Bug 头秃,竟也有了一丝别样的浪漫,好不自在!
今天,他遇到了一个后台的 Bug,游戏死活启动不了,我来帮忙排查一下,顺便给大家分享点编程小知识~
Bug 起因
在开始游戏时,首先要加载一些配置,比如玩家的用户名、关卡的难度、玩家的初始道具等。
由于游戏是使用 Java 语言开发的,他把这些配置封装成了一个对象,代码如下:
// 游戏配置
class GameConfig {
// 玩家名
String name;
// 游戏难度
int difficulty;
// 玩家物品
String[] items;
}
为了开发调试方便,他写了一个默认的配置;并且为了方便管理默认配置,把它单独存放到了一个 JSON 格式的文件中,而不是写死在代码里。
默认 JSON 配置文件如下:
{
"name": "yupi",
"difficulty": 5,
"items": ["一级头", "二级甲"]
}
然后在程序中,读取该配置文件中的 JSON 字符串,再通过 Gson
解析库将 JSON 字符串转换为 Java 对象,就能获取到游戏配置信息,从而进行下一步处理了。
逻辑代码如下:
// 加载游戏配置
void loadConfig() {
String jsonStr = loadFile('config.json');
GameConfig config = new Gson()
.fromJson(jsonStr, GameConfig.class);
// 获取玩家名称
String name = config.getName();
// 更多处理
...
}
整个流程看起来非常简单,为啥会报错呢?
打印出异常信息,很明显,是 JSON 解析错误了:
仔细一看,哎,这小糊涂,配置文件竟然输错了,行尾少了个必要的引号,当然会解析失败了!
{
// 行尾都少了个引号
"items": ["一级头", "二级甲]
}
他表示很无奈,没办法,开发的时候配置越堆越多、改来改去,一不注意就少打个字符了。
我笑到:JSON 格式确实是很灵活强大的,我们在工作中,也经常会编写一些复杂的嵌套 JSON。我倒是知道一个办法,可以帮助减少 JSON 文件写错的概率。
他不以为然:哦,什么办法?用编辑器或者校验网站检查一下?
我:那也只能检查基本的语法吧,来来来,给你个更好康的神器 —— JSON Schema!
JSON Schema
JSON 格式的优点之一就是轻量,其本身并不支持写注释,所以没办法直接在文件本身中对字段进行描述。
因此,假如我们用 JSON 来做配置文件,大多数情况下都要对着文档来查看每个字段的类型、限制范围,才能编写出正确的配置。这样做不仅效率低,而且必须要自己来校验编写出的配置是否正确,一不小心就写错了。
而 JSON Schema 就是为解决此问题而生的,他本身就是 JSON 文件,用来注解和校验 JSON 文件。
举个例子,上面的游戏配置中,因为不小心输错了字符串数组导致程序出了 Bug。那可以编写一个 JSON Schema 来校验 items 字段是否为合法数组,代码如下:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://www.code-nav.cn/latest.json",
"title": "GameConfig",
"description": "游戏配置",
"type": "object",
"properties": {
"items": {
"type": "array"
}
}
}
在这个文件中,指定了 GameConfig 的类型必须为 object(对象),且 items 属性类型必须为 array(数组)。
接下来在要校验的数据中指定 "$schema" 字段为该校验文件地址,比如下列 JSON 配置,故意把 items 字段的值设置为 string(字符串)而非数组:
{
"$schema": "https://www.code-nav.cn/latest.json",
{
"name": "yupi",
"difficulty": 5,
"items": "haha"
}
}
这样就能检查数据是否合法啦!很多主流的编辑器(比如 JetBrains 全家桶)可以自动识别校验文件,并且检查你的 JSON 输入是否合法。也可以使用 JSON Schema validation online
等在线校验 JSON Schema 的网页来查看效果:
JSON Schema 功能非常强大,除了对字段类型的校验外,还支持判断字段是否必填、是否为某个值(支持正则表达式)、最大值最小值、字段个数、枚举等,甚至支持组合多个判断条件!
比如还可以给我们的游戏配置的难度字段添加校验,必须是 1 到 5 之间的数字,语法如下:
"difficulty": {
"type": "number",
"minimum": 1,
"maximum": 5
}
优点
了解什么是 JSON Schema 后,总结下它的优点:
- 对数据格式进行描述,提高可读性,帮助人类理解
- 让机器更理解数据,从而提供数据校验和提示输入等功能
- 提供了统一的数据规范语法,便于实现接口格式校验、自动化测试,甚至还能利用它自动生成代码!比如 jsonschema2pojo 工具,根据 JSON 生成 Java 类。
总之,利用好 JSON Schema,能大大减少开发者们沟通的成本、保证代码的质量就对了。毕竟 JSON 可是当今前后端开发中最流行的数据交换格式啊!
看着他一脸懵逼的样子,我不禁笑到:这个鱼皮就是逊啦!
求求给这么逊的鱼皮 点赞 支持一下吧 ️
最后再送大家一些 编程学习资料:
欢迎阅读 我的编程学习和大厂求职经历,不再迷茫!
3 分钟了解 JSON Schema的更多相关文章
- .net 项目使用 JSON Schema
.net 项目使用 JSON Schema 最近公司要做配置项的改造,要把appsettings.json的内容放到数据库,经过分析还是用json的方式存储最为方便,项目改动性最小,这就牵扯到一个问题 ...
- 使用JSON Schema来验证接口数据
最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...
- 技术那么多,你想看看JSON Schema的测试吗?
目录 1. 什么是JSON Schema? 2. 如何定义一个JSON Schema 3. 如何测试JSON Schema a) 使用JSON Schema validator GUI b) 在Jav ...
- Json.Net使用JSON Schema验证JSON格式【实例】
给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...
- Json.Net使用JSON Schema验证JSON格式
Json.NET supports the JSON Schema standard via the JsonSchema and JsonValidatingReader classes. It s ...
- JSON Schema 校验实例
JSON Schema 简介 JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. ...
- Json Schema的使用
直接上案例: 在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法. 服务端是使用Json.net(n ...
- Json Schema简介
1. 引言 什么是Json Schema? 以一个例子来说明 假设有一个web api,接受一个json请求,返回某个用户在某个城市关系最近的若干个好友.一个请求的例子如下: { "city ...
- json schema校验
工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下. json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, obj ...
随机推荐
- easyswoole实现线上更新代码
众所周知,easyswoole作为常驻内存的框架,修改代码并不能直接生效,而是需要重启服务,那么,当你的easyswoole项目上线之后,该如何保证旧请求的同时去更新代码呢? nginx reload ...
- XCTF logmein
一.查壳 发现是64位的Linux文件(ELF可以看出是linux的文件) 二.拖入ida64,静态分析 注意这里两个坑: 1.strcpy是复制字符串的意思,前面定义的v8数组只有8个,但是后面的字 ...
- WAF集成:Acunetix和FortiWeb
Acunetix API使您有机会自动化任务以提高效率,尤其是在您可以加速与工作流其他组件的集成功能时.在此示例中,我们将在上一篇文章的基础上,向您展示如何在Bash脚本中使用Acunetix API ...
- Elasticsearch-02-入门:集群、节点、分片、索引及常用API
2. 基础入门 2.1 重要概念 2.1.1 集群和节点 1)cluster Elasticsearch集群是由一个或多个节点组成,通过其集群名称来进行唯一标识.节点在搜索到集群之后,通过判断自身的 ...
- 机器学习Sklearn系列:(三)决策树
决策树 熵的定义 如果一个随机变量X的可能取值为X={x1,x2,..,xk},其概率分布为P(X=x)=pi(i=1,2,...,n),则随机变量X的熵定义为\(H(x) = -\sum{p(x)l ...
- 基于SSM框架的旅游网站
介绍:spring+springmvc+mybatis三大框架,mysql数据库 功能结构图: 效果截图: 数据库表: CREATE TABLE `t_admin` ( `id` int(11) NO ...
- Leetcode春季打卡第四天:994. 腐烂的橘子
Leetcode春季打卡第四天:994. 腐烂的橘子 Leetcode春季打卡第四天:994. 腐烂的橘子 思路 思路是采用广度优先搜索,一层一层遍历. 首先先扫描矩阵,将坏橘子放进队列,记录正常橘子 ...
- python内置函数--- hasattr、setattr、getattr
1.描述 hasattr() 函数用于判断对象是否包含对应的属性. 语法 hasattr 语法: hasattr(object, name) 2.描述 setattr() 函数对应函数 getattr ...
- 第七篇--如何改变vs2017版的背景
改变背景 C:\Users\zsunny\AppData\Local\Microsoft\VisualStudio\15.0_9709afbe\Extensions\o0g0c52k.3od\Imag ...
- [NOI 2021] 轻重边 题解
提供一种和不太一样的树剖解法(一下考场就会做了qwq),尽量详细讲解. 思路 设重边为黑色,轻边为白色. 首先,先将边的染色转化为点的染色(即将 \(u\) 节点连向父节点的边的颜色转化为 \(u\) ...