如何第一時間看到新文章?
收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。
從語法、品質規則與資料契約三個層次說明 JSON Validator、JSON Linter 與 JSON Schema 的差異,並以同一份 API 資料示範完整流程。
一段 JSON 能被解析,不代表它一定符合 API;Validator 顯示有效,Linter 仍可能提出警告。這些結果並不衝突,因為三者檢查的是不同層次。
JSON Validator 檢查文字是否合法,JSON Linter 檢查品質與一致性,JSON Schema 描述資料必須符合的結構與限制。
| 工具 | 核心問題 | 典型結果 |
|---|---|---|
| JSON Validator | 這是不是合法 JSON? | 通過或語法錯誤位置 |
| JSON Linter | 是否符合品質、風格與團隊規則? | 警告與改善建議 |
| JSON Schema | 應用程式允許什麼資料結構? | 可由驗證器執行的資料契約 |
> 建議順序:先驗證語法,再執行 Lint,最後依 JSON Schema 驗證資料契約。
「JSON Validator」可能指兩種工具:語法驗證器使用解析器檢查 JSON 文字;JSON Schema Validator 則接收 Schema 與 JSON Instance,判斷資料是否符合契約。
Json Work 的 JSON Validator主要屬於前者。JSON Schema 官方文件中的 Validator 通常指後者。討論系統時最好明確寫出 syntax validator 或 schema validator,避免雙方用同一個詞描述不同關卡。
null 等語法。以下內容因缺少逗號而無效:{
"id": 101
"name": "Alice"
}語法驗證器能發現缺少逗號、引號或括號未閉合、非法跳脫、未加雙引號的鍵,以及 undefined、NaN 等不支援的值。
但下面的內容語法完全有效:
{
"id": "one hundred",
"email": "not-an-email",
"active": "yes"
}Validator 不知道 id 應為整數,也不知道 active 應為布林值。它只回答「這是不是合法 JSON 文字」。語法失敗時可先用 JSON Validator定位;若內容只是接近 JSON,再使用 JSON Repair產生候選修復並人工複核。
Lint 是依規則執行的靜態分析。它不像 JSON 語法有單一標準,規則通常由工具或團隊依可維護性與風險制定。
{
"user_id": 101,
"userName": "Alice",
"isActive": "true"
}這是合法 JSON,但 Linter 可能提示命名風格混用、布林欄位看似使用字串、相同欄位型別不一致或巢狀結構過深。這些是待確認的規則結果,不一定代表資料錯誤;上游契約也可能明確要求字串 "true"。
因此 JSON Linter適合檢查團隊約定與可疑結構,卻不能在沒有契約時證明業務資料錯誤。
JSON Schema 是描述與限制 JSON 文件的標準化詞彙,可表達型別、必填欄位、陣列元素、長度、範圍、列舉與組合條件。JSON Schema 官方網站將驗證、互通交換與文件化列為主要用途。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": { "type": "integer" },
"name": { "type": "string", "minLength": 1 },
"email": { "type": "string", "format": "email" },
"active": { "type": "boolean" }
},
"required": ["id", "name", "email"],
"additionalProperties": false
}Schema 是規則文件,不是執行程式。仍需 Ajv 或 Python jsonschema 等 Schema Validator 將它套用至實際 Instance。官方入門教學也明確區分兩者。實作選項同樣重要,例如 format 依驗證器與設定可能只是註解,而非強制斷言。官方 format 說明特別提醒了這點。
可先用 JSON Schema 產生器從代表性樣本建立初稿,再人工補上範圍、長度、正規表示式、列舉與額外欄位政策。
{
"id": "101",
"name": "Alice",
"email": "alice@example.com",
"active": "true"
}id 與 active 看起來用了可疑字串型別,但無法證明意圖。id 必須是整數,active 必須是布林值。語法有效 ≠ 風格一致 ≠ 符合業務契約
| 能力 | Validator | Linter | JSON Schema |
|---|---|---|---|
| 檢查 JSON 語法 | 是 | 通常先要求語法有效 | Schema 本身也須為合法 JSON |
| 約束欄位型別 | 否 | 可提示 | 可以正式約束 |
| 約束必填欄位 | 否 | 無法可靠判斷 | 可以 |
| 檢查命名風格 | 否 | 可以 | 不是主要用途 |
| 約束數值範圍 | 否 | 可能提示 | 可以 |
| 適合 API 契約 | 不足 | 不足 | 是 |
Schema 無法取代所有業務邏輯,例如「結束時間必須晚於開始時間」或權限判斷通常仍需應用程式處理。
import Ajv from "ajv";
const schema = {
type: "object",
properties: {
id: { type: "integer" },
name: { type: "string" },
active: { type: "boolean" }
},
required: ["id", "name"],
additionalProperties: false
};
const data = { id: "101", name: "Alice", active: true };
const ajv = new Ajv({ allErrors: true });
const validate = ajv.compile(schema);
if (!validate(data)) console.log(validate.errors);Ajv 會報告 id 不符合 integer。其官方指南建議編譯一次 Schema 並重複使用驗證函式。若輸入是網路原始文字,仍應先解析 JSON,讓語法錯誤與契約錯誤分開呈現。
Validator 守住合法語法,Linter 守住品質與一致性,JSON Schema 守住結構與資料契約。可靠做法是依序組合,而不是只選一個。
可以先使用 JSON Validator,再用 JSON Linter檢查品質,最後透過 JSON Schema 產生器建立可維護的資料契約。所有處理都能在瀏覽器本機完成。
致力於為開發者提供最佳的 JSON 處理工具
更多文章即將發布...
返回部落格關於跟進更新、選題與互動方式。
收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。
圍繞 JSON 驗證、格式化、轉換與除錯流程,以及 JSON Work 工具更新,與站內工具的本地能力互相呼應。
可以。請透過關於頁的聯絡方式或 GitHub 回饋;我們會優先安排貼近真實開發情境的教學。