JSON Schema Validator:錯誤附路徑與原因
這個 JSON Schema Validator 讓你貼上 Schema 和 JSON 資料,馬上看出兩者是否相符。如果不符,每個錯誤都會附上失敗的值的路徑,以及一句看得懂的原因,例如 $.users[0].email。它支援 draft-07、2019-09 和 2020-12,兩個輸入欄的內容都留在你的裝置上。
怎麼使用:貼上 Schema 和資料
- 把 Schema 貼到JSON Schema欄位(欄位裡寫著「在這裡貼上你的 JSON Schema...」)。
- 把要檢查的資料貼到JSON 資料欄位。
- 查看結果。貼上時,或停止輸入約 300 毫秒後就會更新,所以沒有按鈕要按。
- 綠色的有效加上「JSON 資料符合 Schema。」代表資料通過。紅色的「無效:3 個錯誤」則會逐一列出失敗的地方。
- 修改資料(或 Schema),結果會隨著編輯即時改變。
兩個欄位都填好之前,結果會顯示「貼上 Schema 和 JSON 資料,就能檢查。」如果某個欄位的內容不是 JSON,會出現紅色的JSON 無效方框,列出原因和「第 X 行,第 Y 欄」,結果也會告訴你該修正哪一個欄位。想先整理雜亂的文件,可以用「JSON格式化工具」,它對壞掉的 JSON 會顯示相同的行與欄。
怎麼看錯誤:路徑與原因
每個錯誤都有兩部分:路徑和原因。路徑從資料的根 $ 開始,用點連接屬性名稱,並用方括號表示陣列的位置,從 0 開始算。舉例來說,Schema 規定 id 要是 1 以上的整數、email 要符合 email 格式、tags 不能重複,而資料是 {"id":"7","email":"ana@","tags":["a","a"]},結果就會是「無效:3 個錯誤」:
$.id:必須是整數,但目前是字串。$.email:必須符合「email」格式。$.tags:項目 [0] 和 [1] 相同,但每個項目都必須不同。
列出的是所有錯誤,不只第一個,所以你可以一次修好整份文件。超過 100 個錯誤時,清單最後會有類似「還有 250 個錯誤未顯示」的一行,標題裡的數字仍然是準確的。如果缺少必要屬性(required),錯誤會顯示在本該包含它的物件路徑上,例如 $.users[0]。比較少見的關鍵字,像 not、contains、propertyNames、dependentRequired 和 if/then/else,也都有各自清楚的原因。
嚴格模式:additionalproperties false
預設情況下,Schema 允許多餘的屬性:資料裡有 Schema 完全沒提到的 nick 欄位,一樣會通過。開啟嚴格模式(「資料中若有 Schema 未列出的屬性,就會判定為失敗。」)就能抓出打錯的字和遺留的屬性。用上面的 Schema 和資料 {"id":1,"email":"ana@example.com","nick":"x"},關閉模式時結果是「有效」,開啟後則是在 $ 出現「無效:1 個錯誤」(出現未預期的屬性「nick」)。
開關背後,工具會在根 Schema,以及每個描述物件的屬性或項目 Schema 中加入 unevaluatedProperties: false,跨過 $ref 也有效。你在欄位裡的文字不會被更動。
- 已經自行設定
additionalProperties或unevaluatedProperties的 Schema,會保留它自己的選擇。 - 沒有
properties的自由格式{"type":"object"}維持開放。 allOf、anyOf、oneOf的各個分支和$defs裡的項目不會自行鎖定,所以並列的分支可以各自宣告自己的屬性。
支援的 JSON Schema 版本、$ref 與格式
工具會讀取 Schema 的 "$schema" 那一行,用對應的規則檢查資料:http://json-schema.org/draft-07/schema# 當作 draft-07,https://json-schema.org/draft/2019-09/schema 當作 2019-09,https://json-schema.org/draft/2020-12/schema 當作 2020-12。沒有 "$schema" 時使用 2020-12;如果用的是較舊的寫法,例如 items 裡放陣列,則使用 2019-09。draft-04、draft-06 或其他位址都不支援,結果會顯示 Schema 宣告的位址。這很重要,因為各版本之間有些關鍵字改了:prefixItems 屬於 2020-12,而 definitions 在 2019-09 變成了 $defs。參照路徑兩種寫法都能用:#/$defs/name 和 #/definitions/name。
$ref只會在同一份 Schema 內追蹤。工具不會下載任何東西,所以像https://example.com/address.json這種遠端參照,會被回報為 Schema 沒有定義的參照。請把那份 Schema 貼進自己的$defs,再讓$ref指過去。format會被檢查,不會被忽略:email、date、date-time、uri、uuid 等常見格式不符時,會顯示「必須符合格式」。- Schema 本身有問題時,會顯示「Schema 本身無效」,並列出指向 Schema 內部的問題與路徑(例如
"type": "strng")。在 Schema 修好之前,不會檢查資料。如果有 pattern 不是有效的規則運算式,則會顯示「無法使用這份 Schema」。
限制與隱私
- 每個欄位最多可輸入 5,000,000 個字元。超過時,結果會請你貼上較短的內容。
- 清單只列出前 100 個錯誤,總數則一律會計算。
- 只支援 JSON:YAML 和完整的 OpenAPI 檔案必須先轉換。這個 JSON 驗證工具只負責驗證,不會根據資料產生 Schema,也不會幫你修正資料。
- 數字的讀取方式和一般的
JSON.parse相同,所以大於 9,007,199,254,740,991 的整數在檢查前就會失去精確度。 - Schema 和資料都在你的瀏覽器中檢查,不會上傳或儲存。
常見問題
怎麼使用 JSON Schema Validator 線上檢查資料?
把 Schema 貼到「JSON Schema」欄位,把要檢查的資料貼到「JSON 資料」欄位。結果會在貼上時立刻出現,或在你停止輸入約 300 毫秒後更新。綠色的「有效」代表資料相符;紅色的「無效」會列出每個錯誤的路徑與原因。沒有按鈕要按。
支援哪些 JSON Schema 版本?draft-07、2019-09 還是 2020-12?
三種都支援。版本由 Schema 的「$schema」那一行決定。沒有「$schema」的 Schema 會當作 2020-12 檢查;如果用的是較舊的寫法,例如 items 裡放陣列,則當作 2019-09。宣告 draft-04、draft-06 或其他 $schema 位址的 Schema,會被回報為不支援。
$.users[0].email 這樣的路徑是什麼意思?
它是失敗的值所在的位置。$ 是你的 JSON 資料的根,.users 是名為 users 的屬性,[0] 是該陣列的第一個項目(從 0 開始算),.email 是其中的屬性。像 $.users[2].address.zip 這樣的路徑,也是一步一步通往那個值。
json schema required property 缺少時,為什麼錯誤顯示在上層物件?
因為缺少的屬性不存在,沒有東西可以指。錯誤會顯示在本該包含它的物件路徑上,例如 $.users[0],原因是「缺少必要屬性「email」。」把屬性加到那個物件裡,錯誤就會消失。
怎麼讓 Schema 拒絕多餘的屬性(additionalproperties false)?
開啟「嚴格模式」。它會在根 Schema,以及每個描述物件的屬性或項目 Schema 中加入 unevaluatedProperties: false,因此 Schema 沒有列出的屬性都會以「出現未預期的屬性」判定失敗。已經自行設定 additionalProperties 或 unevaluatedProperties 的 Schema 會保留自己的選擇。
會檢查 email、date-time、uri、uuid 這類格式嗎?
會。「format」關鍵字會被檢查,所以像 ana@ 這樣的位址在 “format”: “email” 的字串上會失敗,並顯示「必須符合「email」格式。」常見格式都有支援,包括 email、date、date-time、time、uri、uuid、ipv4、ipv6 和 hostname。
可以用 $ref 參照到其他檔案或網址嗎?
只能在同一份 Schema 內,例如 #/$defs/name 或 #/definitions/name。工具不會下載任何東西,所以像 https://example.com/address.json 這樣的參照,會被回報為 Schema 沒有定義的參照。請把被參照的 Schema 複製到自己的 $defs,再讓 $ref 指過去。
「Schema 本身無效」是什麼意思?
代表 Schema 違反了 JSON Schema 的規則,例如寫成 “type”: “strng”,或把 “minimum” 寫成文字。結果會列出問題,路徑指向 Schema 內部。在 Schema 修好之前,不會檢查資料。
我的 Schema 或 JSON 資料會被上傳到哪裡嗎?
不會。Schema 和資料都在你的瀏覽器中檢查,不會上傳或儲存,也不需要帳號。