大家好,我不是鱼皮。

幸运又不幸,我是一名程序员,他也是一名程序员。

周末,我在开发网站,他在开发游戏,两个人一起写代码,一起写 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 后,总结下它的优点:

  1. 对数据格式进行描述,提高可读性,帮助人类理解
  2. 让机器更理解数据,从而提供数据校验和提示输入等功能
  3. 提供了统一的数据规范语法,便于实现接口格式校验、自动化测试,甚至还能利用它自动生成代码!比如 jsonschema2pojo 工具,根据 JSON 生成 Java 类。

总之,利用好 JSON Schema,能大大减少开发者们沟通的成本、保证代码的质量就对了。毕竟 JSON 可是当今前后端开发中最流行的数据交换格式啊!


看着他一脸懵逼的样子,我不禁笑到:这个鱼皮就是逊啦!

求求给这么逊的鱼皮 点赞 支持一下吧 ❤️

最后再送大家一些 编程学习资料

指路:https://t.1yb.co/qOJG

欢迎阅读 我的编程学习和大厂求职经历,不再迷茫!

指路:https://t.1yb.co/w66s

3 分钟了解 JSON Schema相关推荐

  1. json schema多种形式_什么是JSON Schema?

    什么是JSON Schema? 如果你曾经使用过XML Schema,RelaxNG或ASN.1,那么你很可能已经知道什么是JSON Schema,并且可以跳过本文的阅读.如果你是头一次听说,或者听过 ...

  2. laravel 验证器怎么验证json对象_Postman使用tv4进行JSON Schema结构验证和断言

    JSON Scheme简介 对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段.此时我们可以使用JSON Scheme Validator(JSON结构验证)来验 ...

  3. rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)

    rest-assured从2.1.0版本开始支持  Schema 验证,包括JSON Schema validation及Xml Schema validation.我们之前断言响应体都是一个一个字段 ...

  4. json schema多种形式_什么是JSON Schema?及其应用方式......

    如果你曾经使用过XML Schema,RelaxNG或ASN.1,那么你很可能已经知道什么是JSON Schema,并且可以跳过本文的阅读.如果你是头一次听说,或者听过过这个词汇但不了解,那么你来对地 ...

  5. json schema如何约束为小数_如何使用jsonschema进行接口响应断言

    一,JSONSchema的概念 JSONSchema是一种用来描述JSON数据的一种JSON数据结构.JSON Schema也有版本,目前的版本有 Draft 7,Draft 6,Draft 4 和D ...

  6. Json Schema快速入门

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

  7. Json Schema的使用

    直接上案例: 在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法. 服务端是使用Json.net(n ...

  8. JSON Schema

    XML有XML Schema,有Schema的好处就是可以校验文件是否符合规范,在代码提示上也会有许多好处.JSON Schema用于JSON验证. 如果说JSON是盛放数据的袋子,那么JSON Sc ...

  9. 如何快速写出Json Schema,校验Json Schema

    本文首发于微信公众号: [软测小生] 得到一个Json文件,如何快速的去测试呢? 难道是一个个节点的去验证吗?那显然效率太低了. 一般推荐使用Json Schema(一种Json的数据结构定义)去校验 ...

最新文章

  1. 已知机器人阿木木_LOL殇之机器人 阿木木皮肤
  2. taro 重新加载小程序_Taro 小程序采坑
  3. html5 svg 电路图,HTML5 SVG 分子结构图
  4. 4.7 CNN 特征可视化-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. Linux环境用Sendmail架设Mail服务器
  6. java机试 数据结构_来看看阿里面试的一面都面了些什么笔试+机试(java岗)
  7. C# 三种方式实现Socket数据接收(经典)
  8. 【渝粤题库】陕西师范大学700009 现代生物科技
  9. Nodejs ejs模板引擎
  10. 持续集成部署Jenkins工作笔记0014---curl命令触发构建
  11. Markdown插入代码
  12. 微信小程序漏洞:可下载任意微信小游戏源代码(附赠源码)
  13. git fatal: unable to access *** Timed out
  14. 微信自动推送早安问候教程
  15. 思科交换机配置【串口初始配置】
  16. MapReduce之幺半群
  17. 这一次,彻底拿下操作系统!!!
  18. 浮窗---创建Activity浮窗(可拖动)
  19. Round 1—数据结构基本概念
  20. 手机app网易邮箱服务器设置,苹果手机iphone怎么设置网易邮箱 iphone设置网易邮箱教程【步骤】...

热门文章

  1. dt程序网站服务器配置,ZKWeb 官网与演示站点的部署步骤 (Linux + Nginx + Certbot)
  2. c#解析json字符串数组_C#解析JSON字符串总结
  3. linux杀掉进程后总是重启,Linux监控进程,进程关闭自动重启方案
  4. linux u盘加载阵列卡驱动步骤,Linux U盘加载阵列卡驱动步骤
  5. python问题解决方案_Python安装、遇到的问题及解决方案,python,和,方法
  6. 德云斗笑社何九华为什么没参加_狗狗的身体卡在了门上,女主人低头一看忍不住笑了:这是膨胀了...
  7. boss上这样沟通,更容易得到面试机会
  8. 2022图书出版行业营销白皮书
  9. 国内首家,每周到岗上班3天,携程率先推出“3+2”混合办公模式
  10. 掌握这些方法,后台设计变得简单起来