Apa itu Validasi JSON Schema?
Validasi JSON Schema adalah proses memeriksa apakah sebuah dokumen JSON sesuai dengan sekumpulan batasan struktural dan nilai yang didefinisikan dalam JSON Schema. Schema itu sendiri adalah dokumen JSON yang menggambarkan bentuk data yang diharapkan: properti mana yang wajib ada, tipe apa yang harus dimiliki, rentang yang diizinkan untuk angka, pola string, panjang array, dan banyak lagi. Spesifikasi JSON Schema dikelola di json-schema.org dan diterbitkan sebagai serangkaian draft IETF, dengan Draft 7 dan Draft 2020-12 yang paling banyak diadopsi.
Validasi JSON biasa hanya memeriksa sintaks (apakah tanda kurung sudah sesuai? apakah string dikutip dengan benar?), sedangkan validasi schema melangkah lebih jauh. Validasi schema menjawab pertanyaan seperti: apakah respons dari API ini mengandung field "id" yang selalu berupa integer? Apakah field "status" adalah salah satu dari tiga nilai yang diizinkan? Apakah objek bersarang berbentuk dengan benar? Jenis verifikasi struktural ini menangkap bug yang luput dari pemeriksaan sintaks sepenuhnya, karena JSON yang valid secara sintaks tetap bisa salah secara semantik untuk aplikasi Anda.
JSON Schema digunakan dalam definisi OpenAPI/Swagger, validasi file konfigurasi, validasi formulir, batasan dokumen basis data, dan pengujian otomatis. Alat seperti Ajv (JavaScript), jsonschema (Python), dan check-jsonschema (CLI) mengimplementasikan spesifikasi ini sehingga Anda dapat memvalidasi data secara terprogram. Validator online ini memungkinkan Anda menempelkan schema dan dokumen data untuk memeriksa kesesuaian secara langsung, tanpa menginstal library apa pun.
Mengapa Menggunakan Validator JSON Schema Online?
Menulis schema dan men-debug error validasi secara manual membutuhkan waktu lama. Validator JSON Schema online memberikan umpan balik instan apakah data Anda sesuai dengan schema, disertai pesan error yang jelas menunjukkan properti mana yang gagal.
Kasus Penggunaan Validasi JSON Schema
Referensi Kata Kunci JSON Schema
JSON Schema dibangun dari kata kunci yang masing-masing memberlakukan batasan pada data yang divalidasi. Tabel di bawah mencantumkan kata kunci yang paling umum digunakan dalam Draft 7 dan setelahnya. Setiap kata kunci dapat dikombinasikan dengan yang lain dalam objek schema yang sama.
| Kata Kunci | Tujuan | Contoh |
|---|---|---|
| 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" } } } |
Perbandingan Draft JSON Schema: Draft 7 vs 2019-09 vs 2020-12
JSON Schema telah melalui beberapa versi draft. Draft 7 (diterbitkan 2018) paling banyak didukung oleh alat yang ada. Draft 2019-09 memperkenalkan $defs (menggantikan definitions), unevaluatedProperties, dan $recursiveRef. Draft 2020-12 (rilis stabil terbaru) mengganti $recursiveRef dengan $dynamicRef dan memperkenalkan prefixItems untuk validasi tuple. Saat memilih draft, pastikan library validasi Anda mendukungnya. Ajv mendukung ketiga draft. Library jsonschema Python mendukung hingga 2020-12 sejak versi 4.0.
| Fitur | 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 |
Contoh Kode
Contoh-contoh ini menunjukkan cara memvalidasi JSON terhadap schema secara terprogram. Masing-masing menggunakan library yang terawat baik untuk ekosistem bahasanya.
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