ToolDeck

ตรวจสอบ JSON Schema

ตรวจสอบข้อมูล JSON กับ JSON Schema (Draft 7)

ลองตัวอย่าง

ข้อมูล JSON

JSON Schema

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ

JSON Schema Validation คืออะไร?

JSON Schema validation คือกระบวนการตรวจสอบว่าเอกสาร JSON เป็นไปตามชุดข้อกำหนดด้านโครงสร้างและค่าที่กำหนดไว้ใน JSON Schema หรือไม่ ตัว schema เองก็เป็นเอกสาร JSON ที่อธิบายรูปแบบที่คาดหวังของข้อมูล: ระบุว่า property ใดบ้างที่จำเป็น ชนิดข้อมูลที่ต้องเป็น ช่วงค่าที่อนุญาตสำหรับตัวเลข รูปแบบสตริง ความยาวของอาร์เรย์ และอื่นๆ ข้อกำหนด JSON Schema ดูแลโดย json-schema.org และเผยแพร่เป็น IETF draft หลายชุด โดย Draft 7 และ Draft 2020-12 ได้รับการนำไปใช้อย่างแพร่หลายที่สุด

การตรวจสอบ JSON แบบทั่วไปจะตรวจสอบเพียงไวยากรณ์เท่านั้น (วงเล็บปิดครบไหม? สตริงมีเครื่องหมายอัญประกาศไหม?) แต่การตรวจสอบด้วย schema ก้าวไปอีกขั้น โดยตอบคำถามเช่น: การตอบสนองจาก API นี้มีฟิลด์ "id" ที่เป็นจำนวนเต็มเสมอไหม? ฟิลด์ "status" เป็นหนึ่งในสามค่าที่อนุญาตไหม? ออบเจกต์ที่ซ้อนอยู่มีโครงสร้างถูกต้องไหม? การตรวจสอบโครงสร้างในลักษณะนี้ช่วยจับข้อผิดพลาดที่การตรวจสอบไวยากรณ์พลาดไปโดยสิ้นเชิง เพราะ JSON ที่ถูกต้องทางไวยากรณ์ก็อาจผิดในเชิงความหมายสำหรับแอปพลิเคชันของคุณได้

JSON Schema ถูกใช้งานในนิยาม OpenAPI/Swagger การตรวจสอบไฟล์คอนฟิก การตรวจสอบฟอร์ม ข้อกำหนดเอกสารในฐานข้อมูล และการทดสอบอัตโนมัติ เครื่องมืออย่าง Ajv (JavaScript), jsonschema (Python) และ check-jsonschema (CLI) นำข้อกำหนดนี้ไปใช้งานเพื่อให้คุณตรวจสอบข้อมูลได้ตามโปรแกรม ตัวตรวจสอบออนไลน์นี้ช่วยให้คุณวาง schema และเอกสารข้อมูลเพื่อตรวจสอบความสอดคล้องได้ทันที โดยไม่ต้องติดตั้งไลบรารีใดๆ

ทำไมต้องใช้ JSON Schema Validator ออนไลน์?

การเขียน schema และแก้จุดบกพร่องของข้อผิดพลาดการตรวจสอบด้วยตนเองนั้นช้า JSON Schema validator ออนไลน์ให้ผลตอบรับทันทีว่าข้อมูลของคุณตรงกับ schema หรือไม่ พร้อมข้อความแสดงข้อผิดพลาดที่ชี้ชัดไปยัง property ที่ล้มเหลว

ผลตอบรับการตรวจสอบทันที
วาง schema และข้อมูลของคุณ แล้วดูผลการตรวจสอบแบบเรียลไทม์ ข้อผิดพลาดแต่ละรายการแสดง JSON path และข้อกำหนดเฉพาะที่ล้มเหลว ทำให้คุณแก้ไขปัญหาได้โดยไม่ต้องอ่าน output ของไลบรารี validator
🔒
ประมวลผลในเบราว์เซอร์ ข้อมูลไม่ออกไปไหน
ข้อมูล JSON ของคุณจะไม่ออกจากเบราว์เซอร์เลย การตรวจสอบทั้งหมดทำงานในเครื่องผ่าน JavaScript ไม่มีเซิร์ฟเวอร์ ไม่มีบันทึก ไม่มีการจัดเก็บข้อมูล ปลอดภัยสำหรับ schema ที่อธิบาย API ภายในองค์กรหรือมีชื่อฟิลด์ที่เป็นความลับ
🎯
รองรับ keyword ตาม draft
ตัวตรวจสอบรองรับ keyword ของ Draft 7 ได้แก่ type, required, properties, enum, pattern, minimum/maximum, items, anyOf, oneOf, allOf และ additionalProperties ทดสอบ schema ของคุณที่นี่ก่อนนำไปใช้ใน build pipeline หรือ test suite
📋
ไม่ต้องสมัครสมาชิกหรือติดตั้ง
เปิดหน้าเว็บ วาง JSON แล้วตรวจสอบได้เลย ไม่ต้องรัน npm install ไม่ต้องติดตั้ง pip package ไม่ต้องใช้ Docker image มีประโยชน์เมื่อต้องการตรวจสอบ schema อย่างรวดเร็วบนเครื่องที่ไม่สามารถติดตั้งเครื่องมือสำหรับนักพัฒนาได้

กรณีการใช้งาน JSON Schema Validation

การทดสอบสัญญา API
ตรวจสอบการตอบสนองของ API กับ schema ที่กำหนดไว้ใน OpenAPI spec จับการเปลี่ยนแปลงที่ทำลายสัญญา เช่น ฟิลด์ที่เปลี่ยนจาก integer เป็น string ก่อนที่จะขึ้น production
การตรวจสอบไฟล์คอนฟิก
ตรวจสอบว่าไฟล์คอนฟิก JSON สำหรับ CI/CD pipeline, Kubernetes manifest หรือการตั้งค่าแอปพลิเคชันตรงกับ schema ที่คาดหวังก่อน commit เพื่อป้องกันความล้มเหลวในการ deploy ที่เกิดจากคีย์ที่หายไปหรือพิมพ์ผิด
การตรวจสอบใน DevOps pipeline
เพิ่มการตรวจสอบ schema เป็นขั้นตอน CI เพื่อปฏิเสธ payload ที่ละเมิดสัญญา ใช้ได้กับไฟล์ตัวแปรของ Terraform, input ของ GitHub Actions หรือ JSON แบบมีโครงสร้างใดๆ ที่ระบบอัตโนมัตินำไปใช้
การตรวจสอบข้อมูลทดสอบและ QA
ตรวจสอบว่า test fixture และไฟล์ mock data เป็นไปตาม schema เดียวกับที่แอปพลิเคชันของคุณคาดหวัง ข้อมูลทดสอบที่ไม่ตรงกันเป็นสาเหตุทั่วไปของผลการทดสอบที่ให้ผลบวกปลอม
การรับข้อมูลใน data pipeline
ตรวจสอบข้อมูล JSON ที่เข้ามาที่ขอบ data pipeline การตรวจสอบ schema กรองอีเวนต์ที่ผิดรูปแบบออกก่อนที่จะไปถึง data warehouse ช่วยลดต้นทุนการทำความสะอาดข้อมูลภายหลัง
การเรียนรู้ไวยากรณ์ JSON Schema
ทดลองใช้ keyword ของ schema แบบโต้ตอบ เขียน schema วางข้อมูลทดสอบ แล้วดูว่าข้อกำหนดใดผ่านหรือล้มเหลว เร็วกว่าการเขียนสคริปต์และรันจาก terminal ทุกครั้ง

อ้างอิง Keyword ของ JSON Schema

JSON Schema ถูกสร้างขึ้นจาก keyword ที่แต่ละตัวกำหนดข้อจำกัดบนข้อมูลที่ตรวจสอบ ตารางด้านล่างแสดง keyword ที่ใช้บ่อยที่สุดใน Draft 7 และรุ่นหลังจากนั้น keyword ทุกตัวสามารถใช้ร่วมกับตัวอื่นในออบเจกต์ schema เดียวกันได้

Keywordวัตถุประสงค์ตัวอย่าง
typeRestricts the data type"type": "string"
propertiesDefines expected object keys and their schemas"properties": { "name": { "type": "string" } }
requiredLists mandatory properties"required": ["id", "name"]
itemsSchema for array elements"items": { "type": "number" }
enumRestricts value to a fixed set"enum": ["active", "inactive"]
patternRegex constraint on strings"pattern": "^[A-Z]{2}\\d{4}$"
minimum / maximumNumeric range bounds"minimum": 0, "maximum": 100
minLength / maxLengthString length bounds"minLength": 1, "maxLength": 255
$refReuses another schema by URI"$ref": "#/$defs/address"
additionalPropertiesControls extra keys in objects"additionalProperties": false
anyOf / oneOf / allOfCombines multiple schemas logically"anyOf": [{ "type": "string" }, { "type": "null" }]
if / then / elseConditional schema application"if": { "properties": { "type": { "const": "email" } } }

เปรียบเทียบ JSON Schema Draft: Draft 7 vs 2019-09 vs 2020-12

JSON Schema ผ่านการพัฒนามาหลาย draft Draft 7 (เผยแพร่ปี 2018) ได้รับการสนับสนุนจากเครื่องมือต่างๆ อย่างกว้างขวางที่สุด Draft 2019-09 แนะนำ $defs (แทนที่ definitions), unevaluatedProperties และ $recursiveRef Draft 2020-12 (เวอร์ชันเสถียรล่าสุด) แทนที่ $recursiveRef ด้วย $dynamicRef และแนะนำ prefixItems สำหรับการตรวจสอบ tuple เมื่อเลือก draft ให้ตรวจสอบว่าไลบรารีที่ใช้รองรับ Ajv รองรับทั้งสาม draft ส่วนไลบรารี jsonschema ของ Python รองรับจนถึง 2020-12 ตั้งแต่เวอร์ชัน 4.0

คุณสมบัติDraft 7Draft 2019-09Draft 2020-12
$schema URIdraft-07/schema#2019-09/schema2020-12/schema
if / then / elseYesYesYes
$defs (definitions)definitions$defs$defs
$ref alongside keysNo (sibling ignored)YesYes
$dynamicRefNoNo ($recursiveRef)Yes
prefixItemsNo (use items array)No (use items array)Yes
unevaluatedPropertiesNoYesYes
$vocabularyNoYesYes

ตัวอย่างโค้ด

ตัวอย่างเหล่านี้แสดงวิธีตรวจสอบ JSON กับ schema ตามโปรแกรม แต่ละตัวอย่างใช้ไลบรารีที่ได้รับการดูแลรักษาดีในระบบนิเวศภาษานั้นๆ

JavaScript (Ajv)
import Ajv from 'ajv';

const ajv = new Ajv();

const schema = {
  type: 'object',
  properties: {
    name: { type: 'string', minLength: 1 },
    age: { type: 'integer', minimum: 0 },
    email: { type: 'string', format: 'email' }
  },
  required: ['name', 'email'],
  additionalProperties: false
};

const data = { name: 'Alice', age: 30, email: 'alice@example.com' };

const validate = ajv.compile(schema);
const valid = validate(data);
console.log(valid);          // → true
console.log(validate.errors); // → null

// Invalid data — missing required "email"
validate({ name: 'Bob', age: 25 });
console.log(validate.errors);
// → [{ instancePath: '', keyword: 'required', params: { missingProperty: 'email' } }]
Python (jsonschema)
from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "age": {"type": "integer", "minimum": 0},
        "tags": {
            "type": "array",
            "items": {"type": "string"},
            "uniqueItems": True
        }
    },
    "required": ["name"]
}

# Valid data
validate(instance={"name": "Alice", "age": 30, "tags": ["admin"]}, schema=schema)
# → No exception raised

# Invalid data — wrong type for "age"
try:
    validate(instance={"name": "Alice", "age": "thirty"}, schema=schema)
except ValidationError as e:
    print(e.message)
    # → 'thirty' is not of type 'integer'
    print(e.json_path)
    # → $.age
Go (santhosh-tekuri/jsonschema)
package main

import (
    "fmt"
    "strings"
    "github.com/santhosh-tekuri/jsonschema/v5"
)

func main() {
    schemaJSON := `{
        "type": "object",
        "properties": {
            "id": { "type": "integer" },
            "status": { "enum": ["active", "inactive"] }
        },
        "required": ["id", "status"]
    }`

    compiler := jsonschema.NewCompiler()
    compiler.AddResource("schema.json", strings.NewReader(schemaJSON))
    schema, _ := compiler.Compile("schema.json")

    // Valid data
    data := map[string]interface{}{"id": 1, "status": "active"}
    err := schema.Validate(data)
    fmt.Println(err) // → <nil>

    // Invalid — missing "status"
    bad := map[string]interface{}{"id": 2}
    err = schema.Validate(bad)
    fmt.Println(err) // → validation failed: missing properties: 'status'
}
CLI (check-jsonschema)
# Install via pip
pip install check-jsonschema

# Validate a file against a schema
check-jsonschema --schemafile schema.json data.json
# → ok -- validation done

# Validate against a remote schema (e.g., GitHub Actions workflow)
check-jsonschema --builtin-schema vendor.github-workflows my-workflow.yml

# Validate multiple files at once
check-jsonschema --schemafile schema.json file1.json file2.json file3.json

คำถามที่พบบ่อย

ความแตกต่างระหว่าง JSON validation และ JSON Schema validation คืออะไร?
JSON validation ตรวจสอบว่าสตริงเป็น JSON ที่ถูกต้องทางไวยากรณ์: วงเล็บซ้อนกันถูกต้อง คีย์มีเครื่องหมายอัญประกาศ ไม่มีเครื่องหมายจุลภาคท้าย JSON Schema validation ก้าวไปอีกขั้นและตรวจสอบว่าข้อมูล JSON ที่แยกวิเคราะห์แล้วตรงกับสัญญาโครงสร้าง: ชนิดข้อมูลถูกต้อง ฟิลด์ที่จำเป็นมีอยู่ ค่าอยู่ในช่วงที่อนุญาต คุณต้องมี JSON ที่ถูกต้องก่อนจึงจะใช้ schema ได้ แต่ JSON ที่ถูกต้องก็ยังอาจล้มเหลวการตรวจสอบ schema
ควรใช้ JSON Schema draft ไหน?
Draft 7 เป็นตัวเลือกที่ปลอดภัยที่สุดสำหรับการเริ่มต้น รองรับไลบรารีได้กว้างขวางที่สุดในทุกภาษาและครอบคลุม keyword ที่โปรเจกต์ส่วนใหญ่ต้องการ ได้แก่ type, properties, required, enum, pattern, anyOf, oneOf, allOf และ $ref ใช้ Draft 2020-12 หากต้องการคุณสมบัติเช่น prefixItems สำหรับการตรวจสอบ tuple, $dynamicRef สำหรับ schema ที่ขยายได้ หรือ unevaluatedProperties สำหรับการกำหนดรูปแบบออบเจกต์อย่างเข้มงวด ตรวจสอบเอกสารของไลบรารี validator ว่ารองรับ draft ที่เลือกก่อนอัปเกรด
$ref ทำงานอย่างไรใน JSON Schema?
keyword $ref ช่วยให้คุณอ้างอิง schema อื่นด้วย URI แทนที่จะคัดลอก ค่าอย่าง "$ref": "#/$defs/address" ชี้ไปยัง schema ที่กำหนดในส่วน $defs ของเอกสารเดียวกัน คุณยังอ้างอิงไฟล์ภายนอกได้ด้วย "$ref": "https://example.com/schemas/address.json" ใน Draft 7, $ref จะแทนที่ keyword พี่น้องทั้งหมดในออบเจกต์เดียวกัน ใน Draft 2019-09 และรุ่นหลังจากนั้น keyword พี่น้องจะถูกนำไปใช้ควบคู่กับ $ref
ความแตกต่างระหว่าง anyOf, oneOf และ allOf คืออะไร?
allOf กำหนดให้ข้อมูลต้องตรงกับทุก sub-schema ในอาร์เรย์ anyOf กำหนดให้ตรงกับ sub-schema อย่างน้อยหนึ่งตัว oneOf กำหนดให้ตรงกับ sub-schema ตัวเดียวเท่านั้น และล้มเหลวหากข้อมูลตรงกับศูนย์หรือมากกว่าหนึ่ง สำหรับฟิลด์ที่รับค่า null ได้ anyOf ที่มีชนิดข้อมูลและ null เป็นรูปแบบที่นิยม: {"anyOf": [{"type": "string"}, {"type": "null"}]} ใช้ oneOf เมื่อ sub-schema ไม่ทับซ้อนกัน เช่น tagged union
JSON Schema ตรวจสอบออบเจกต์และอาร์เรย์ที่ซ้อนกันได้ไหม?
ได้ ใช้ keyword properties เพื่อกำหนด schema สำหรับคีย์ของออบเจกต์ที่ซ้อนอยู่ และ keyword items เพื่อกำหนด schema ที่สมาชิกอาร์เรย์ทุกตัวต้องตรงกัน คุณสามารถซ้อนได้ลึกเท่าที่ต้องการ สำหรับอาร์เรย์ที่แต่ละตำแหน่งมี schema ต่างกัน (tuple) ให้ใช้ prefixItems ใน Draft 2020-12 หรือรูปแบบอาร์เรย์ของ items ใน Draft 7
ข้อมูลที่วางในเครื่องมือนี้ถูกส่งไปยังเซิร์ฟเวอร์ไหม?
ไม่ ตัวตรวจสอบทำงานทั้งหมดในเบราว์เซอร์ของคุณผ่าน JavaScript ข้อมูล JSON และ schema ของคุณจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ คุณสามารถตรวจสอบได้โดยเปิด network inspector ของเบราว์เซอร์ขณะใช้เครื่องมือ
จะตรวจสอบ JSON Schema ใน CI/CD pipeline ได้อย่างไร?
ใช้ CLI validator อย่าง check-jsonschema (Python/pip) หรือ ajv-cli (Node.js/npm) ทั้งคู่รับไฟล์ schema และไฟล์ข้อมูลหนึ่งไฟล์หรือมากกว่าเป็น argument เพิ่มคำสั่งตรวจสอบเป็นขั้นตอนใน CI config ของคุณ หากการตรวจสอบล้มเหลว กระบวนการจะออกด้วยรหัสที่ไม่ใช่ศูนย์ ซึ่งบล็อก pipeline สำหรับ GitHub Actions คุณยังสามารถใช้ check-jsonschema action โดยตรง