大家好,我不是魚皮。
幸運又不幸,我是一名程式設計師,他也是一名程式設計師。
週末,我在開發網站,他在開發遊戲,兩個人一起寫程式碼,一起寫 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 可是當今前後端開發中最流行的資料交換格式啊!
看著他一臉懵逼的樣子,我不禁笑到:這個魚皮就是遜啦!
求求給這麼遜的魚皮 點贊 支援一下吧 ️
最後再送大家一些 程式設計學習資料:
歡迎閱讀 我的程式設計學習和大廠求職經歷,不再迷茫!