最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

3 分鐘了解 JSON Schema

2021-08-24 19:35 作者:程序員魚皮  | 我要投稿

大家好,我不是魚皮。

幸運(yùn)又不幸,我是一名程序員,他也是一名程序員。

周末,我在開發(fā)網(wǎng)站,他在開發(fā)游戲,兩個(gè)人一起寫代碼,一起寫 Bug 頭禿,竟也有了一絲別樣的浪漫,好不自在!

結(jié)對(duì)編程

今天,他遇到了一個(gè)后臺(tái)的 Bug,游戲死活啟動(dòng)不了,我來幫忙排查一下,順便給大家分享點(diǎn)編程小知識(shí)~

Bug 起因

在開始游戲時(shí),首先要加載一些配置,比如玩家的用戶名、關(guān)卡的難度、玩家的初始道具等。

由于游戲是使用 Java 語言開發(fā)的,他把這些配置封裝成了一個(gè)對(duì)象,代碼如下:

//?游戲配置
class?GameConfig?{
??//?玩家名
??String?name;
??//?游戲難度
??int?difficulty;
??//?玩家物品
??String[]?items;
}

為了開發(fā)調(diào)試方便,他寫了一個(gè)默認(rèn)的配置;并且為了方便管理默認(rèn)配置,把它單獨(dú)存放到了一個(gè) JSON 格式的文件中,而不是寫死在代碼里。

默認(rèn) JSON 配置文件如下:

{
??"name":?"yupi",
??"difficulty":?5,
??"items":?["一級(jí)頭",?"二級(jí)甲"]
}

然后在程序中,讀取該配置文件中的 JSON 字符串,再通過 Gson 解析庫(kù)將 JSON 字符串轉(zhuǎn)換為 Java 對(duì)象,就能獲取到游戲配置信息,從而進(jìn)行下一步處理了。

邏輯代碼如下:

//?加載游戲配置
void?loadConfig()?{
??String?jsonStr?=?loadFile('config.json');
??GameConfig?config?=?new?Gson()
????.fromJson(jsonStr,?GameConfig.class);
??//?獲取玩家名稱
??String?name?=?config.getName();
?//?更多處理
??...
}

整個(gè)流程看起來非常簡(jiǎn)單,為啥會(huì)報(bào)錯(cuò)呢?

打印出異常信息,很明顯,是 JSON 解析錯(cuò)誤了:

仔細(xì)一看,哎,這小糊涂,配置文件竟然輸錯(cuò)了,行尾少了個(gè)必要的引號(hào),當(dāng)然會(huì)解析失敗了!

{
??//?行尾都少了個(gè)引號(hào)
??"items":?["一級(jí)頭",?"二級(jí)甲]
}

他表示很無奈,沒辦法,開發(fā)的時(shí)候配置越堆越多、改來改去,一不注意就少打個(gè)字符了。

我笑到:JSON 格式確實(shí)是很靈活強(qiáng)大的,我們?cè)诠ぷ髦?,也?jīng)常會(huì)編寫一些復(fù)雜的嵌套 JSON。我倒是知道一個(gè)辦法,可以幫助減少 JSON 文件寫錯(cuò)的概率。

他不以為然:哦,什么辦法?用編輯器或者校驗(yàn)網(wǎng)站檢查一下?

我:那也只能檢查基本的語法吧,來來來,給你個(gè)更好康的神器 —— JSON Schema!

JSON Schema

JSON 格式的優(yōu)點(diǎn)之一就是輕量,其本身并不支持寫注釋,所以沒辦法直接在文件本身中對(duì)字段進(jìn)行描述。

因此,假如我們用 JSON 來做配置文件,大多數(shù)情況下都要對(duì)著文檔來查看每個(gè)字段的類型、限制范圍,才能編寫出正確的配置。這樣做不僅效率低,而且必須要自己來校驗(yàn)編寫出的配置是否正確,一不小心就寫錯(cuò)了。

而 JSON Schema 就是為解決此問題而生的,他本身就是 JSON 文件,用來注解和校驗(yàn) JSON 文件。

舉個(gè)例子,上面的游戲配置中,因?yàn)椴恍⌒妮斿e(cuò)了字符串?dāng)?shù)組導(dǎo)致程序出了 Bug。那可以編寫一個(gè) JSON Schema 來校驗(yàn) items 字段是否為合法數(shù)組,代碼如下:

{
??"$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"
????}
??}
}

在這個(gè)文件中,指定了 GameConfig 的類型必須為 object(對(duì)象),且 items 屬性類型必須為 array(數(shù)組)。

接下來在要校驗(yàn)的數(shù)據(jù)中指定 "$schema" 字段為該校驗(yàn)文件地址,比如下列 JSON 配置,故意把 items 字段的值設(shè)置為 string(字符串)而非數(shù)組:

{
??"$schema":?"https://www.code-nav.cn/latest.json",
??{
???"name":?"yupi",
???"difficulty":?5,
???"items":?"haha"
?}
}

這樣就能檢查數(shù)據(jù)是否合法啦!很多主流的編輯器(比如 JetBrains 全家桶)可以自動(dòng)識(shí)別校驗(yàn)文件,并且檢查你的 JSON 輸入是否合法。也可以使用 JSON Schema validation online 等在線校驗(yàn) JSON Schema 的網(wǎng)頁(yè)來查看效果:

在線校驗(yàn)

JSON Schema 功能非常強(qiáng)大,除了對(duì)字段類型的校驗(yàn)外,還支持判斷字段是否必填、是否為某個(gè)值(支持正則表達(dá)式)、最大值最小值、字段個(gè)數(shù)、枚舉等,甚至支持組合多個(gè)判斷條件!

比如還可以給我們的游戲配置的難度字段添加校驗(yàn),必須是 1 到 5 之間的數(shù)字,語法如下:

"difficulty":?{
??"type":?"number",
??"minimum":?1,
??"maximum":?5
}

優(yōu)點(diǎn)

了解什么是 JSON Schema 后,總結(jié)下它的優(yōu)點(diǎn):

  1. 對(duì)數(shù)據(jù)格式進(jìn)行描述,提高可讀性,幫助人類理解

  2. 讓機(jī)器更理解數(shù)據(jù),從而提供數(shù)據(jù)校驗(yàn)和提示輸入等功能

  3. 提供了統(tǒng)一的數(shù)據(jù)規(guī)范語法,便于實(shí)現(xiàn)接口格式校驗(yàn)、自動(dòng)化測(cè)試,甚至還能利用它自動(dòng)生成代碼!比如 jsonschema2pojo 工具,根據(jù) JSON 生成 Java 類。

自動(dòng)生成代碼

總之,利用好 JSON Schema,能大大減少開發(fā)者們溝通的成本、保證代碼的質(zhì)量就對(duì)了。畢竟 JSON 可是當(dāng)今前后端開發(fā)中最流行的數(shù)據(jù)交換格式?。?/p>

看著他一臉懵逼的樣子,我不禁笑到:這個(gè)魚皮就是遜啦!

求求給這么遜的魚皮 點(diǎn)贊 支持一下吧 ??

最后再送大家一些 編程學(xué)習(xí)資料

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

歡迎閱讀 我的編程學(xué)習(xí)和大廠求職經(jīng)歷,不再迷茫!

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



3 分鐘了解 JSON Schema的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
浦县| 土默特右旗| 六盘水市| 五河县| 铅山县| 兴山县| 固原市| 桦甸市| 古田县| 嘉定区| 海安县| 长宁区| 阿鲁科尔沁旗| 新建县| 大悟县| 会同县| 新丰县| 蓝山县| 珠海市| 沙坪坝区| 潮州市| 蕲春县| 井冈山市| 咸宁市| 天等县| 鄯善县| 千阳县| 永川市| 南宁市| 安阳市| 即墨市| 乳山市| 江阴市| 文安县| 安多县| 仙桃市| 烟台市| 沙河市| 屯昌县| 大冶市| 印江|