ToolDeck

اعتبارسنج JSON Schema

داده‌های JSON را در برابر یک JSON Schema (Draft 7) اعتبارسنجی کنید

یک مثال امتحان کنید

داده JSON

JSON Schema

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است

اعتبارسنجی JSON Schema چیست؟

اعتبارسنجی JSON Schema فرآیندی است که بررسی می‌کند آیا یک سند JSON با مجموعه‌ای از محدودیت‌های ساختاری و مقداری که در یک JSON Schema تعریف شده‌اند مطابقت دارد یا نه. خود schema یک سند JSON است که شکل مورد انتظار داده‌های شما را توصیف می‌کند: کدام ویژگی‌ها اجباری هستند، چه نوع‌هایی باید داشته باشند، محدوده‌های مجاز اعداد، الگوهای رشته‌ای، طول آرایه‌ها و موارد دیگر. مشخصات JSON Schema در json-schema.org نگهداری می‌شود و به صورت مجموعه‌ای از پیش‌نویس‌های IETF منتشر شده است؛ 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 استفاده کنیم؟

نوشتن schema و رفع اشکال خطاهای اعتبارسنجی به صورت دستی کند است. یک اعتبارسنج آنلاین JSON Schema بازخورد فوری درباره انطباق داده‌ها با schema ارائه می‌دهد، با پیام‌های خطای واضحی که دقیقاً فیلد خطادار را نشان می‌دهند.

بازخورد اعتبارسنجی فوری
schema و داده‌های خود را بچسبانید و نتایج اعتبارسنجی را به صورت لحظه‌ای ببینید. هر خطا مسیر JSON و محدودیت خاصی که رعایت نشده را نشان می‌دهد، تا بتوانید مشکلات را بدون خواندن خروجی کتابخانه‌های اعتبارسنج برطرف کنید.
🔒
پردازش فقط در مرورگر، با رعایت حریم خصوصی
داده‌های JSON شما هرگز مرورگرتان را ترک نمی‌کنند. تمام اعتبارسنجی به صورت محلی در JavaScript اجرا می‌شود. بدون سرور، بدون ثبت گزارش، بدون نگهداری داده. برای schema‌هایی که API‌های داخلی را توصیف می‌کنند یا حاوی نام فیلدهای اختصاصی هستند، کاملاً ایمن است.
🎯
با پشتیبانی از نسخه‌های Draft
این اعتبارسنج کلیدواژه‌های schema در Draft 7 را پشتیبانی می‌کند از جمله type، required، properties، enum، pattern، minimum/maximum، items، anyOf، oneOf، allOf و additionalProperties. schema خود را اینجا آزمایش کنید پیش از آنکه آن را به pipeline ساخت یا مجموعه آزمون‌هایتان متصل کنید.
📋
بدون حساب کاربری یا نصب
صفحه را باز کنید، JSON خود را بچسبانید و اعتبارسنجی کنید. بدون npm install، بدون بسته pip، بدون ایمیج Docker. مفید است وقتی روی دستگاهی نیاز به بررسی سریع schema دارید و نمی‌توانید ابزارهای توسعه نصب کنید.

موارد استفاده از اعتبارسنجی JSON Schema

آزمون قرارداد API
پاسخ‌های API را در برابر schema تعریف‌شده در مشخصات OpenAPI اعتبارسنجی کنید. تغییرات شکننده را شناسایی کنید، مانند تغییر نوع یک فیلد از integer به string، پیش از اینکه به محیط تولید برسند.
بررسی فایل‌های پیکربندی
اطمینان حاصل کنید که فایل‌های پیکربندی JSON برای pipeline‌های CI/CD، manifest‌های Kubernetes یا تنظیمات برنامه، پیش از commit با schema مورد انتظار مطابقت دارند. از خرابی‌های deployment ناشی از کلیدهای گم یا اشتباه‌تایپ‌شده جلوگیری می‌کند.
دروازه‌های pipeline در DevOps
اعتبارسنجی schema را به عنوان یک مرحله CI اضافه کنید تا payload‌هایی که قرارداد را نقض می‌کنند رد شوند. این برای فایل‌های متغیر Terraform، ورودی‌های GitHub Actions یا هر JSON ساختاریافته‌ای که توسط اتوماسیون مصرف می‌شود کارآمد است.
بررسی داده‌های آزمون و QA
تأیید کنید که fixture‌های آزمون و فایل‌های داده mock با همان schema‌ای که برنامه‌تان انتظار دارد مطابقت دارند. عدم تطابق داده‌های آزمون یک منبع رایج نتایج مثبت کاذب در آزمون‌ها است.
ورودی داده در pipeline پردازش
رکوردهای JSON ورودی را در لبه یک pipeline پردازش داده اعتبارسنجی کنید. اعتبارسنجی schema رویدادهای بدشکل را پیش از رسیدن به انبار داده فیلتر می‌کند و هزینه‌های پاکسازی پایین‌دستی را کاهش می‌دهد.
یادگیری نحو JSON Schema
با کلیدواژه‌های schema به صورت تعاملی آزمایش کنید. یک schema بنویسید، داده‌های آزمون را بچسبانید و ببینید کدام محدودیت‌ها قبول یا رد می‌شوند. سریع‌تر از اینکه هر بار یک اسکریپت بنویسید و از ترمینال اجرا کنید.

مرجع کلیدواژه‌های JSON Schema

یک JSON Schema از کلیدواژه‌هایی ساخته می‌شود که هر کدام یک محدودیت بر داده‌های اعتبارسنجی‌شده اعمال می‌کنند. جدول زیر پرکاربردترین کلیدواژه‌ها در Draft 7 و نسخه‌های بعدی را فهرست می‌کند. هر کلیدواژه می‌تواند با دیگران در همان شیء schema ترکیب شود.

کلیدواژههدفمثال
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 7 در مقابل 2019-09 در مقابل 2020-12

JSON Schema از چندین نسخه پیش‌نویس عبور کرده است. Draft 7 (منتشرشده در ۲۰۱۸) پرپشتیبانی‌ترین نسخه در ابزارها است. Draft 2019-09 کلیدواژه‌های $defs (جایگزین definitions)، unevaluatedProperties و $recursiveRef را معرفی کرد. Draft 2020-12 (آخرین نسخه پایدار) کلیدواژه‌ی $recursiveRef را با $dynamicRef جایگزین کرد و prefixItems برای اعتبارسنجی tuple را معرفی نمود. هنگام انتخاب نسخه، بررسی کنید که کتابخانه اعتبارسنجی شما از آن پشتیبانی می‌کند. Ajv هر سه نسخه را پشتیبانی می‌کند. کتابخانه jsonschema پایتون از نسخه 4.0 تا 2020-12 را پشتیبانی می‌کند.

ویژگی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 و اعتبارسنجی JSON Schema چیست؟
اعتبارسنجی JSON بررسی می‌کند آیا یک رشته، نحو JSON معتبری دارد: براکت‌های درست تودرتو، کلیدهای داخل کوتیشن، بدون کاما اضافی در انتها. اعتبارسنجی JSON Schema یک گام فراتر می‌رود و بررسی می‌کند آیا داده‌های JSON پارس‌شده با یک قرارداد ساختاری مطابقت دارند: نوع‌های صحیح، فیلدهای اجباری موجود، مقادیر در محدوده‌های مجاز. برای اعمال schema به JSON معتبر نیاز دارید، اما JSON معتبر می‌تواند هنوز در اعتبارسنجی schema ناموفق باشد.
کدام نسخه JSON Schema را باید استفاده کنم؟
Draft 7 امن‌ترین گزینه پیش‌فرض است. بیشترین پشتیبانی کتابخانه‌ای را در زبان‌های مختلف دارد و کلیدواژه‌های مورد نیاز اکثر پروژه‌ها را پوشش می‌دهد: type، properties، required، enum، pattern، anyOf، oneOf، allOf و $ref. از Draft 2020-12 استفاده کنید اگر به ویژگی‌هایی مانند prefixItems برای اعتبارسنجی tuple، $dynamicRef برای schema‌های قابل گسترش، یا unevaluatedProperties برای اشکال دقیق شیء نیاز دارید. پیش از ارتقا، مستندات کتابخانه اعتبارسنج خود را بررسی کنید.
دستور $ref در JSON Schema چگونه کار می‌کند؟
کلیدواژه $ref به شما امکان می‌دهد به جای تکرار یک schema، به آن از طریق URI ارجاع دهید. مقداری مانند "$ref": "#/$defs/address" به یک schema تعریف‌شده در بخش $defs همان سند اشاره می‌کند. همچنین می‌توانید به فایل‌های خارجی با "$ref": "https://example.com/schemas/address.json" ارجاع دهید. در Draft 7، کلیدواژه‌ی $ref تمام کلیدواژه‌های هم‌سطح در همان شیء را جایگزین می‌کند. در Draft 2019-09 و بعد از آن، کلیدواژه‌های هم‌سطح در کنار $ref اعمال می‌شوند.
تفاوت بین anyOf، oneOf و allOf چیست؟
allOf الزام می‌کند داده با همه sub-schema‌های موجود در آرایه مطابقت داشته باشد. anyOf الزام می‌کند با حداقل یک sub-schema مطابقت داشته باشد. oneOf الزام می‌کند دقیقاً با یک sub-schema مطابقت داشته باشد و در صورت مطابقت با صفر یا بیش از یکی ناموفق است. برای فیلدهای nullable، استفاده از anyOf با یک نوع و null رایج است: {"anyOf": [{"type": "string"}, {"type": "null"}]}. از oneOf زمانی استفاده کنید که sub-schema‌ها به صورت متقابل انحصاری هستند، مانند union‌های tagged.
آیا JSON Schema می‌تواند اشیاء تودرتو و آرایه‌ها را اعتبارسنجی کند؟
بله. از کلیدواژه properties برای تعریف schema برای کلیدهای اشیاء تودرتو، و از کلیدواژه items برای تعریف schema‌ای که هر عنصر آرایه باید با آن مطابقت داشته باشد استفاده کنید. می‌توانید اینها را به هر عمقی تودرتو کنید. برای آرایه‌هایی که هر موقعیت schema متفاوتی دارد (tuple‌ها)، از prefixItems در Draft 2020-12 یا شکل آرایه‌ای items در Draft 7 استفاده کنید.
آیا داده‌هایی که در این ابزار وارد می‌کنم به سرور ارسال می‌شوند؟
خیر. اعتبارسنج کاملاً در مرورگر شما با استفاده از JavaScript اجرا می‌شود. داده‌های JSON و schema شما هرگز به هیچ سروری منتقل نمی‌شوند. می‌توانید این را با باز کردن بازرس شبکه مرورگر خود هنگام استفاده از ابزار تأیید کنید.
چگونه JSON Schema را در یک pipeline CI/CD اعتبارسنجی کنم؟
از یک اعتبارسنج CLI مانند check-jsonschema (Python/pip) یا ajv-cli (Node.js/npm) استفاده کنید. هر دو یک فایل schema و یک یا چند فایل داده را به عنوان آرگومان می‌پذیرند. دستور اعتبارسنجی را به عنوان یک مرحله در پیکربندی CI خود اضافه کنید. اگر اعتبارسنجی ناموفق باشد، فرآیند با یک کد غیرصفر خارج می‌شود که pipeline را بلاک می‌کند. برای GitHub Actions می‌توانید همچنین مستقیماً از action مربوط به check-jsonschema استفاده کنید.