使用說明

JSON Schema Validator:錯誤附路徑與原因

這個 JSON Schema Validator 讓你貼上 Schema 和 JSON 資料,馬上看出兩者是否相符。如果不符,每個錯誤都會附上失敗的值的路徑,以及一句看得懂的原因,例如 $.users[0].email。它支援 draft-07、2019-09 和 2020-12,兩個輸入欄的內容都留在你的裝置上。


怎麼使用:貼上 Schema 和資料

  1. 把 Schema 貼到JSON Schema欄位(欄位裡寫著「在這裡貼上你的 JSON Schema...」)。
  2. 把要檢查的資料貼到JSON 資料欄位。
  3. 查看結果。貼上時,或停止輸入約 300 毫秒後就會更新,所以沒有按鈕要按。
  4. 綠色的有效加上「JSON 資料符合 Schema。」代表資料通過。紅色的「無效:3 個錯誤」則會逐一列出失敗的地方。
  5. 修改資料(或 Schema),結果會隨著編輯即時改變。

兩個欄位都填好之前,結果會顯示「貼上 Schema 和 JSON 資料,就能檢查。」如果某個欄位的內容不是 JSON,會出現紅色的JSON 無效方框,列出原因和「第 X 行,第 Y 欄」,結果也會告訴你該修正哪一個欄位。想先整理雜亂的文件,可以用「JSON格式化工具」,它對壞掉的 JSON 會顯示相同的行與欄。

怎麼看錯誤:路徑與原因

每個錯誤都有兩部分:路徑和原因。路徑從資料的根 $ 開始,用點連接屬性名稱,並用方括號表示陣列的位置,從 0 開始算。舉例來說,Schema 規定 id 要是 1 以上的整數、email 要符合 email 格式、tags 不能重複,而資料是 {"id":"7","email":"ana@","tags":["a","a"]},結果就會是「無效:3 個錯誤」:

列出的是所有錯誤,不只第一個,所以你可以一次修好整份文件。超過 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 也有效。你在欄位裡的文字不會被更動。

支援的 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。

限制與隱私


常見問題

怎麼使用 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 和資料都在你的瀏覽器中檢查,不會上傳或儲存,也不需要帳號。