Skip to content

JSON Schema Validator

Validasi JSON terhadap JSON Schema apa pun secara instan di browser Anda. Mendukung Draft 2020-12, 2019-09, dan Draft-07 dengan pesan error berbasis path yang presisi. 100% privat — tanpa upload, tanpa akun, gratis.

Tanpa Pelacakan Berjalan di Browser Gratis
Tempelkan data JSON dan schema
Reviewed for Draft 2020-12, 2019-09, and Draft-07 compliance, including type coercion edge cases, format vocabulary, $ref resolution, and JSON Pointer error paths. — Go Tools API Tooling Team · May 7, 2026

Apa itu JSON Schema Validator?

JSON Schema Validator adalah program yang menerima dua dokumen JSON — dokumen data dan dokumen schema — dan melaporkan apakah data sesuai dengan kontrak schema. Schema mendeklarasikan tipe field, key required, rentang nilai, nilai enum yang diizinkan, pattern regex, dan aturan struktural menggunakan kosakata tetap (type, properties, required, items, enum, oneOf, allOf, $ref, format). Validator menelusuri kedua dokumen secara paralel dan menerbitkan nol atau lebih error, masing-masing terikat pada path JSON Pointer di dalam data.

Validasi berjalan saat runtime, di batas antara input yang tidak terpercaya dan kode Anda. Type TypeScript hilang saat compile-time dan tidak dapat membantu untuk JSON yang tiba dari webhook, API pihak ketiga, atau paste pengguna — celah itulah yang diisi JSON Schema. Padukan dengan TypeScript (atau Pydantic di Python) dan Anda mendapat jaminan compile-time di dalam codebase plus jaminan runtime di batas.

Draft 2020-12 adalah spesifikasi terbaru dan pilihan untuk proyek baru di 2026. Draft sebelumnya (2019-09, Draft-07, Draft-06, Draft-04) bertahan di codebase legacy — Draft-07 masih umum di Helm chart, settings VS Code, dan konfigurasi Ajv lama. OpenAPI 3.1 memakai Draft 2020-12 secara native; OpenAPI 3.0 memakai subset Draft 4.

Tool ini berjalan sepenuhnya di browser Anda. JSON, schema, dan output validasi tidak pernah meninggalkan mesin Anda — aman untuk kontrak API proprietary dan payload sensitif. Pointer $ref internal di-resolve otomatis; ref HTTP eksternal sengaja dinonaktifkan untuk menjaga privasi.

Bekerja dengan tool JSON yang berdekatan? Format JSON dengan JSON Formatter sebelum menempel; bandingkan dua dokumen JSON dengan JSON Diff; konversi dengan JSON to YAML dan YAML to JSON. Untuk validasi end-to-end di Node, Python, dan browser, lihat panduan validasi JSON Schema kami.

// A 5-line schema that catches three real bugs
const schema = {
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id":    { "type": "integer", "minimum": 1 },
    "email": { "type": "string", "format": "email" },
    "age":   { "type": "integer", "minimum": 0, "maximum": 150 }
  },
  "required": ["id", "email"],
  "additionalProperties": false
};

// Three bugs the schema catches:
const bad = { "id": "42", "age": 200 };
//   /id   → type: expected integer, got string
//   /email → required: missing
//   /age   → maximum: 200 > 150

// In Node:        new Ajv().compile(schema)(bad)  // false; ajv.errors has the paths
// In Python:      jsonschema.validate(bad, schema)
// In the browser: this tool — same errors, same paths, no install

Fitur Utama

Dukungan Multi-Draft

Draft 2020-12 (default), 2019-09, dan Draft-07. Mendeteksi draft otomatis dari URI $schema; selektor fallback untuk schema tanpa URI.

Error Berbasis Path Presisi

Setiap error berisi JSON Pointer (mis. /user/email/0), keyword yang gagal (type, required, pattern), dan pesan satu baris. Klik untuk melompat ke lokasi.

Validasi Live

Memvalidasi saat Anda mengetik. Error terbarui real-time sehingga Anda dapat beriterasi pada schema atau data tanpa harus melalui tombol Validate.

Cakupan Keyword Format

email, uri, uuid, date, date-time, ipv4, ipv6, hostname, regex — format yang benar-benar Anda pakai, divalidasi dengan pattern yang battle-tested.

100% Berbasis Browser

Input tidak pernah meninggalkan mesin Anda. Tanpa upload, tanpa analitik atas yang Anda tempel, tanpa localStorage untuk JSON. Aman untuk kontrak proprietary dan payload sensitif.

Schema Sample, Sekali Klik

Preset yang dapat dimuat (form signup, webhook envelope, file konfigurasi, array of orders) membawa Anda ke validasi yang berfungsi dalam kurang dari lima detik.

Contoh

Object Valid — required + types

{
  "id": 42,
  "email": "alice@example.com",
  "age": 30
}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": { "type": "integer", "minimum": 1 },
    "email": { "type": "string", "format": "email" },
    "age": { "type": "integer", "minimum": 0, "maximum": 150 }
  },
  "required": ["id", "email"],
  "additionalProperties": false
}

Schema mendeklarasikan id dan email sebagai required dan mengunci type. Data di atas lolos — setiap constraint terpenuhi. Coba hapus email atau ubah id menjadi string untuk melihat error berbasis path.

Tidak Valid — required hilang + type salah

{
  "id": "42",
  "age": 200
}
{
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "email": { "type": "string", "format": "email" },
    "age": { "type": "integer", "maximum": 150 }
  },
  "required": ["id", "email"]
}

Tiga error: /id adalah string bukan integer, /email hilang, /age (200) melebihi maximum 150. Setiap error melaporkan path JSON Pointer yang tepat sehingga Anda bisa memperbaiki data — atau melonggarkan schema — tanpa menebak.

Discriminated Union — oneOf dengan const

{
  "type": "order.created",
  "data": { "orderId": "ORD-001234", "totalUsd": 49.99 }
}
{
  "oneOf": [
    {
      "properties": {
        "type": { "const": "order.created" },
        "data": {
          "type": "object",
          "properties": {
            "orderId": { "type": "string", "pattern": "^ORD-[0-9]{6}$" },
            "totalUsd": { "type": "number", "minimum": 0 }
          },
          "required": ["orderId", "totalUsd"]
        }
      },
      "required": ["type", "data"]
    },
    {
      "properties": {
        "type": { "const": "order.refunded" },
        "data": { "type": "object", "required": ["refundId"] }
      },
      "required": ["type", "data"]
    }
  ]
}

Validasi webhook envelope. Cabang oneOf pertama cocok karena type adalah "order.created". Ubah type menjadi "order.refunded" atau rusak pattern orderId untuk melihat bagaimana oneOf melaporkan kegagalan per cabang.

Array of Objects — items + uniqueItems

[
  { "sku": "A1", "qty": 3 },
  { "sku": "B2", "qty": 5 },
  { "sku": "A1", "qty": 3 }
]
{
  "type": "array",
  "minItems": 1,
  "uniqueItems": true,
  "items": {
    "type": "object",
    "properties": {
      "sku": { "type": "string", "pattern": "^[A-Z][0-9]+$" },
      "qty": { "type": "integer", "minimum": 1 }
    },
    "required": ["sku", "qty"]
  }
}

Dua item identik byte-per-byte, jadi uniqueItems aktif. Item 0 dan 2 bertabrakan — validator melaporkan duplikat di root array. Berguna untuk menangkap duplikasi cart-line dan bug merge pada permintaan shipping.

Cara Penggunaan

  1. 1

    Tempelkan JSON Schema Anda

    Letakkan schema Anda di panel kanan. Validator mendeteksi draft otomatis dari URI $schema bila ada; jika tidak, pilih Draft 2020-12, 2019-09, atau Draft-07 dari toolbar.

  2. 2

    Tempelkan data JSON Anda

    Letakkan dokumen JSON yang ingin diperiksa di panel kiri. Validasi berjalan saat mengetik; input besar (>200 KB) beralih ke tombol Validate manual agar pengetikan tetap responsif.

  3. 3

    Baca daftar error

    Setiap error memiliki path JSON Pointer, keyword, dan pesan satu baris. Klik error untuk melompat ke lokasi di data Anda, perbaiki, dan saksikan jumlahnya menurun secara real time.

Jebakan Umum JSON Schema

Type: integer vs number

JSON Schema memperlakukan 1.0 sebagai number tapi bukan integer. Jika kontrak Anda menyebut integer, validator menolak 1.0 — meski sebagian besar bahasa menganggapnya sama dengan 1. Pilih number kecuali Anda benar-benar butuh integer.

✗ Salah
{ "qty": 1.0 }   schema: { "type": "integer" }   → error: not an integer
✓ Benar
{ "qty": 1 }     schema: { "type": "integer" }   → valid

required di Level Nesting yang Salah

required harus berada di samping properties, bukan di dalamnya. Array required di dalam deklarasi property diam-diam diabaikan — validator tidak pernah menegakkannya.

✗ Salah
{ "properties": { "name": { "type": "string", "required": true } } }
✓ Benar
{ "properties": { "name": { "type": "string" } }, "required": ["name"] }

Default additionalProperties Adalah True

Tanpa additionalProperties: false, schema bersifat terbuka — setiap key tambahan lolos. Lupa hal ini adalah alasan paling umum schema "menerima segalanya."

✗ Salah
{ "properties": { "id": { "type": "integer" } } }   accepts: { "id": 1, "foo": "bar", "x": null }
✓ Benar
{ "properties": { "id": { "type": "integer" } }, "additionalProperties": false }

OpenAPI 3.0 nullable vs Type Array Draft 2020-12

OpenAPI 3.0 memakai nullable: true; Draft 2020-12 memakai type: ["string", "null"]. Mencampurnya menghasilkan schema yang terlihat benar tapi tidak pernah benar-benar memperbolehkan null.

✗ Salah
{ "type": "string", "nullable": true }   in 2020-12: nullable is just an unknown keyword
✓ Benar
{ "type": ["string", "null"] }   in 2020-12: explicitly allows null

Pattern Tanpa Anchor

Regex JSON Schema secara default cocok di mana saja — pattern: "^[A-Z]+$" mengikatnya ke seluruh string, sedangkan pattern: "[A-Z]+" cocok bila ada huruf kapital di mana pun.

✗ Salah
pattern: "[A-Z]+"   accepts: "helloX"   (because X matches)
✓ Benar
pattern: "^[A-Z]+$"   accepts only: "HELLO"

oneOf padahal Maksudnya anyOf

oneOf mengharuskan tepat satu cabang cocok. Bila dua cabang menerima shape yang sama, oneOf gagal pada data yang akan lolos di anyOf — dan pesan errornya membingungkan ("matches more than one").

✗ Salah
oneOf: [ { type: "string" }, { type: "string", maxLength: 10 } ]   on: "hi"   → error: matches both
✓ Benar
anyOf: [ { type: "string" }, { type: "string", maxLength: 10 } ]   on: "hi"   → valid

Kasus Penggunaan Umum

Validasi Request API
Tempel request body dan schema endpoint Anda sebelum deploy. Tangkap response 400 yang tidak tercakup test — field required hilang, type salah, angka di luar rentang.
Verifikasi Payload Webhook
Vendor mengirim payload yang ditolak handler Anda? Validasi payload aktual terhadap schema Anda, lalu terhadap schema yang diterbitkan vendor. Selisih antara keduanya adalah bug Anda.
Linting File Konfigurasi
package.json, tsconfig.json, helm values.yaml — setiap file konfigurasi memiliki schema publik. Tempel schema, tempel konfigurasi, temukan typo. Lewati trial-and-error.
Pengujian Komponen OpenAPI
Ambil komponen schema dari dokumen OpenAPI 3.1, tempel di sini, validasi payload sample. Lebih cepat daripada menyalakan mock server, deterministik, tanpa SDK.
Pre-Flight Form Submission
Tempel sample payload form sebelum menyambung validasi frontend. Konfirmasi bahwa schema menolak yang Anda kira ditolak, menerima yang Anda kira diterima, lalu kirim schema yang sama ke client dan server.
Pemeriksaan Kontrak Data Pipeline
Output ETL drift? Tempel sample row dan schema downstream. Identifikasi producer mana yang berubah dan key mana yang rusak sebelum pipeline retry 10.000 record.

Detail Teknis

Sesuai Draft 2020-12
Mengimplementasikan spesifikasi Draft 2020-12 yang dipublikasikan — keyword, sistem type, kosakata format. Diuji silang dengan output Ajv 8.x dan ajv-formats.
Path Error JSON Pointer
Error menggunakan JSON Pointer RFC 6901 (/user/email/0). Setiap kegagalan keyword menunjuk satu lokasi yang dapat diresolve di data — tanpa ambiguitas, tanpa string-search.
Resolusi $ref Internal
Meresolve pointer $ref di dalam satu dokumen (#/$defs/foo, #/properties/bar). Cycle dideteksi dan dilaporkan. $ref HTTP eksternal dinonaktifkan untuk privasi.

Praktik Terbaik

Selalu Set additionalProperties: false
Pada kontrak input (request body, file konfigurasi, queue message), key tidak dikenal biasanya bug — typo, field tak sengaja, atau probing penyerang. Tolak secara default.
Gunakan $defs untuk Subschema yang Reusable
Inline shape yang sama dua kali dan keduanya akan drift. Pindahkan definisi bersama ke $defs dan rujuk dengan $ref — satu source of truth, setiap perubahan berlaku di semua tempat.
Validasi Sebelum Business Logic
Jalankan validasi schema tepat setelah JSON.parse, sebelum menyentuh struktur yang sudah diparsing. Type narrowing, defaulting, dan persistence semuanya berasumsi kontrak terpenuhi — pastikan iya.

Pertanyaan yang Sering Diajukan

Apa itu validasi JSON Schema?
Validasi JSON Schema memeriksa apakah dokumen JSON cocok dengan kontrak yang ditulis dalam syntax JSON Schema. Schema mendeklarasikan tipe field, key required, nilai yang diizinkan, dan aturan struktural; validator menelusuri kedua dokumen secara paralel dan melaporkan setiap path yang melanggar kontrak. Ini berjalan di batas antara input yang tidak terpercaya (request API, webhook, file konfigurasi, payload form) dan business logic Anda — menangkap shape error sebelum merusak kode di hilir. Lihat panduan lengkap validasi JSON Schema kami untuk contoh end-to-end di Node, Python, dan browser.
Draft JSON Schema mana yang didukung validator ini?
Draft 2020-12 (default dan direkomendasikan), Draft 2019-09, dan Draft-07. Validator mendeteksi draft secara otomatis dari URI $schema bila ada dan jika tidak akan memakai pilihan dropdown Anda. Untuk proyek baru di 2026 gunakan Draft 2020-12 — itulah yang dipakai OpenAPI 3.1 secara native dan menjadi default Ajv. Draft-07 masih umum di codebase legacy (setup AJV lama, Helm chart, settings VS Code).
Bagaimana cara memvalidasi JSON terhadap schema?
Tempelkan data JSON ke panel kiri dan JSON Schema ke panel kanan. Validator berjalan instan saat Anda mengetik — tanda hijau berarti valid, daftar merah berarti error. Setiap error menyertakan path JSON Pointer (mis. /user/email), keyword yang gagal (type, required, pattern, minimum), dan pesan yang mudah dibaca. Klik error mana pun untuk melompat ke baris yang bersangkutan. Tanpa upload, tanpa daftar.
Apa perbedaan antara validasi JSON Schema dan validasi syntax JSON?
Validasi syntax JSON hanya memastikan dokumen bisa di-parse — tidak ada koma berlebih, tidak ada kurung yang hilang. JSON Formatter menanganinya. Validasi JSON Schema berjalan setelah parsing dan memeriksa apakah struktur yang sudah diparsing cocok dengan kontrak: field required hadir, type benar, nilai dalam rentang. Biasanya Anda menjalankan keduanya — format dulu untuk memastikan parseable, lalu validasi terhadap schema.
Mengapa schema saya menolak JSON yang terlihat benar?
Lima penyebab umum: (1) additionalProperties: false — data Anda mengandung key yang tidak dideklarasikan schema, sering kali typo atau field baru; (2) type: "integer" vs "number" — JSON Schema memperlakukan 1.0 sebagai number, bukan integer; (3) keyword format (email, uri, uuid) menolak string yang malformed meski terlihat baik; (4) required pada level nesting yang salah — required harus berada di samping properties, bukan di dalamnya; (5) JSON memiliki string "42" sementara schema mengharapkan integer 42. Path error akan menunjuk yang mana.
Apakah ini mendukung $ref dan referensi schema remote?
Pointer $ref internal (#/$defs/foo, #/properties/bar) bekerja langsung. $ref remote ke URL eksternal sengaja dinonaktifkan — mengambil schema eksternal akan membocorkan aktivitas validasi Anda ke pihak ketiga dan merusak model privasi. Untuk memvalidasi terhadap schema multi-file, inline definisi yang dirujuk ke dalam satu dokumen menggunakan $defs, atau jalankan validasi di CI Anda sendiri dengan Ajv di mana remote ref memang sesuai.
Apa fungsi additionalProperties: false?
additionalProperties: false menolak setiap key yang tidak dideklarasikan dalam properties. Ini adalah keyword paling berguna untuk mengetatkan kontrak — tanpanya, schema bersifat terbuka secara default dan diam-diam menerima field salah ketik atau jahat. Selalu set additionalProperties: false pada kontrak input (request body, file konfigurasi, queue message). Biarkan true (atau abaikan) hanya bila schema merupakan deskripsi parsial dari dokumen yang lebih besar.
Bagaimana cara memvalidasi JSON terhadap schema di Node.js atau Python?
Node: install Ajv (npm i ajv ajv-formats), panggil new Ajv().compile(schema), lalu validate(data). Python: install jsonschema (pip install jsonschema), panggil jsonschema.validate(data, schema). Untuk TypeScript, generate type dari schema dengan json-schema-to-typescript agar compile-time dan runtime tetap sinkron. Panduan validasi JSON Schema kami menyediakan resep copy-paste untuk Node, Python, dan browser.
Apa perbedaan antara oneOf, anyOf, dan allOf?
allOf — harus cocok dengan setiap subschema (irisan, dipakai untuk komposisi). anyOf — harus cocok dengan setidaknya satu (gabungan, fast-fail). oneOf — harus cocok dengan tepat satu (discriminated union, lebih lambat tapi lebih ketat). Gunakan oneOf untuk discriminated union seperti event webhook yang ditandai oleh type; gunakan anyOf untuk union permisif; gunakan allOf untuk memperluas schema dasar dengan constraint tambahan. oneOf paling lambat karena menguji setiap cabang — pilih anyOf bila exactly-one tidak diperlukan.
Apakah mendukung schema OpenAPI?
OpenAPI 3.1 menggunakan Draft 2020-12 secara native, jadi komponen schema OpenAPI 3.1 apa pun dapat ditempel langsung. OpenAPI 3.0 menggunakan subset Draft 4 yang sebagian besar kompatibel — Anda mungkin menemui edge case sekitar nullable: true (syntax 3.0) yang dinyatakan Draft 2020-12 sebagai type: ["string", "null"]. Untuk validasi dokumen OpenAPI lengkap (paths, operations, security), gunakan linter OpenAPI dedicated seperti Spectral; tool ini berfokus pada bagian schema.
Mengapa validator mengatakan JSON Schema saya sendiri tidak valid?
JSON Schema adalah dokumen JSON yang harus berupa JSON valid sebelum bisa menjadi schema valid. Penyebab umum: trailing comma di object properties, single quote alih-alih double, $schema mengarah ke URL draft yang tidak ada, atau required ditulis sebagai string alih-alih array. Format schema dulu di JSON Formatter untuk memunculkan masalah syntax, lalu tempel kembali di sini untuk validasi semantis.
Apakah tool mengirim JSON atau schema saya ke server?
Tidak. Semua parsing dan validasi berjalan secara lokal di browser Anda. JSON, schema, dan hasil validasi tidak pernah meninggalkan mesin Anda — tanpa upload, tanpa localStorage untuk input, tanpa analitik atas yang Anda tempel. Aman untuk kontrak API proprietary, file konfigurasi internal, dan payload sensitif. Hanya pilihan draft yang disimpan di localStorage agar bertahan setelah refresh; bersihkan data browser untuk menghapusnya.
Bisakah saya memvalidasi JSON Lines (NDJSON) atau beberapa dokumen?
Tool ini memvalidasi satu dokumen per run. Untuk JSON Lines, validasi setiap baris secara terpisah atau gunakan Ajv di Node dengan schema dan stream parser seperti JSONStream. Untuk validasi batch dataset besar, lebih baik pakai command line — ajv-cli atau check-jsonschema (Python) memproses ribuan file per detik dengan satu kompilasi schema.