JSON Schema ভ্যালিডেশন কী?
JSON Schema ভ্যালিডেশন হলো একটি JSON ডকুমেন্ট কোনো JSON 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 ভ্যালিডেটর কেন ব্যবহার করবেন?
হাতে স্কিমা লেখা এবং ভ্যালিডেশন ত্রুটি ডিবাগ করা ধীর প্রক্রিয়া। একটি অনলাইন JSON Schema ভ্যালিডেটর আপনার ডেটা স্কিমার সাথে মিলছে কি না সে বিষয়ে তাৎক্ষণিক প্রতিক্রিয়া দেয় — স্পষ্ট ত্রুটি বার্তা সহ যা ঠিক কোন প্রপার্টি ব্যর্থ হয়েছে তা নির্দেশ করে।
JSON Schema ভ্যালিডেশনের ব্যবহারের ক্ষেত্র
JSON Schema কীওয়ার্ড রেফারেন্স
JSON Schema কীওয়ার্ডের একটি সংগ্রহ দিয়ে গঠিত, যার প্রতিটি যাচাইকৃত ডেটার উপর একটি সীমাবদ্ধতা আরোপ করে। নিচের তালিকায় Draft 7 এবং পরবর্তী সংস্করণে সবচেয়ে বেশি ব্যবহৃত কীওয়ার্ডগুলো রয়েছে। প্রতিটি কীওয়ার্ড একই স্কিমা অবজেক্টে অন্যগুলোর সাথে মিলিয়ে ব্যবহার করা যায়।
| কীওয়ার্ড | উদ্দেশ্য | উদাহরণ |
|---|---|---|
| type | Restricts the data type | "type": "string" |
| properties | Defines expected object keys and their schemas | "properties": { "name": { "type": "string" } } |
| required | Lists mandatory properties | "required": ["id", "name"] |
| items | Schema for array elements | "items": { "type": "number" } |
| enum | Restricts value to a fixed set | "enum": ["active", "inactive"] |
| pattern | Regex constraint on strings | "pattern": "^[A-Z]{2}\\d{4}$" |
| minimum / maximum | Numeric range bounds | "minimum": 0, "maximum": 100 |
| minLength / maxLength | String length bounds | "minLength": 1, "maxLength": 255 |
| $ref | Reuses another schema by URI | "$ref": "#/$defs/address" |
| additionalProperties | Controls extra keys in objects | "additionalProperties": false |
| anyOf / oneOf / allOf | Combines multiple schemas logically | "anyOf": [{ "type": "string" }, { "type": "null" }] |
| if / then / else | Conditional schema application | "if": { "properties": { "type": { "const": "email" } } } |
JSON Schema Draft তুলনা: Draft 7 বনাম 2019-09 বনাম 2020-12
JSON Schema বেশ কয়েকটি Draft সংস্করণের মধ্য দিয়ে গেছে। Draft 7 (2018 সালে প্রকাশিত) টুলিং-এ সবচেয়ে বেশি সমর্থিত। Draft 2019-09 $defs (definitions-এর পরিবর্তে), unevaluatedProperties এবং $recursiveRef চালু করেছিল। Draft 2020-12 (সর্বশেষ স্থিতিশীল রিলিজ) $recursiveRef-কে $dynamicRef দিয়ে প্রতিস্থাপন করেছে এবং tuple ভ্যালিডেশনের জন্য prefixItems চালু করেছে। Draft বেছে নেওয়ার সময় আপনার ভ্যালিডেশন লাইব্রেরি সেটি সমর্থন করে কিনা যাচাই করুন। Ajv তিনটি Draft-ই সমর্থন করে। Python-এর jsonschema লাইব্রেরি সংস্করণ 4.0 থেকে 2020-12 পর্যন্ত সমর্থন করে।
| বৈশিষ্ট্য | Draft 7 | Draft 2019-09 | Draft 2020-12 |
|---|---|---|---|
| $schema URI | draft-07/schema# | 2019-09/schema | 2020-12/schema |
| if / then / else | Yes | Yes | Yes |
| $defs (definitions) | definitions | $defs | $defs |
| $ref alongside keys | No (sibling ignored) | Yes | Yes |
| $dynamicRef | No | No ($recursiveRef) | Yes |
| prefixItems | No (use items array) | No (use items array) | Yes |
| unevaluatedProperties | No | Yes | Yes |
| $vocabulary | No | Yes | Yes |
কোড উদাহরণ
এই উদাহরণগুলো দেখায় কিভাবে প্রোগ্রামেটিক্যালি একটি স্কিমার বিপরীতে JSON যাচাই করতে হয়। প্রতিটি তার ভাষার ইকোসিস্টেমের জন্য একটি জনপ্রিয় লাইব্রেরি ব্যবহার করে।
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' } }]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)
# → $.agepackage 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'
}# 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