ToolHub
View All Posts

JSON Schema Doğrulama Kılavuzu: Veri Yapılarınızı Doğrulayın

Dış kaynaklardan veri alan her uygulama aynı temel sorunla karşı karşıyadır: Bu verilere güvenebilir miyim? API istek gövdesi, yapılandırma dosyası, kuyruk mesajı veya veri içe aktarma olsun, güvenilmeyen veriler sisteme girmeden önce doğrulanmalıdır. JSON Schema, geçerli verilerin nasıl göründüğünü tanımlamanın ve gelen verilerin bu tanıma uygun olup olmadığını doğrulamanın standartlaştırılmış, dilden bağımsız bir yolunu sağlar. Bu kılavuz, ilk Schema'nızı yazmaktan karmaşık doğrulama için gelişmiş desenlere kadar her şeyi ve hemen uygulayabileceğiniz pratik örnekleri kapsar.

JSON Schema Nedir?

JSON Schema, diğer JSON belgelerinin yapısını ve kısıtlamalarını tanımlayan bir JSON belgesidir. Internet Engineering Task Force (IETF) tarafından standartlaştırılmış, JSON verilerini açıklamanıza ve doğrulamanıza olanak tanıyan bir kelime dağarcığıdır. JSON Schema, hangi alanların bulunması gerektiği, hangi türde olmaları gerektiği, hangi değerlerin kabul edilebilir olduğu ve nesneler ile dizilerin nasıl yapılandırılması gerektiği hakkında kurallar tanımlar.

JSON Schema'yı veri sözleşmeniz olarak düşünün. Veritabanı şemasının tabloların sütunlarını, türlerini ve kısıtlamalarını tanımladığı gibi, JSON Schema da JSON belgelerinin özelliklerini, türlerini ve kısıtlamalarını tanımlar. Schema'daki tüm kısıtlamaları karşılayan JSON verilerine geçerli örnek denir, herhangi bir kısıtlamayı ihlal eden veriler ise geçersizdir.

JSON Schema Ne Değildir

JSON Schema Sürümleri

JSON Schema, her biri özellikler ekleyen ve kelime dağarcığını geliştiren birden çok taslak üzerinden evrimleşmiştir. Bu sürümleri anlamak, projeniz için doğru olanı seçmenize ve uyumluluk sorunlarından kaçınmanıza yardımcı olur.

Sürüm$schema URIDurumTemel Özellikler
Draft 2020-12https://json-schema.org/draft/2020-12/schemaGüncel sürümprefixItems, dynamicRef, kelime dağarcığı desteği
Draft 2019-09https://json-schema.org/draft/2019-09/schemaKararlıunevaluatedProperties, $recursiveRef
Draft 7http://json-schema.org/draft-07/schema#Yaygın destekif/then/else, contentEncoding
Draft 6http://json-schema.org/draft-06/schema#EskipropertyNames, contains
Draft 4http://json-schema.org/draft-04/schema#Kullanımdan kalktıİlk yaygın olarak benimsenen sürüm
Öneri: Yeni projeler için Draft 2020-12 kullanın. En son kararlı sürümdür, en fazla özelliğe sahiptir ve büyük doğrulama kütüphaneleri tarafından desteklenir. Mevcut araçlarla maksimum uyumluluk gerekiyorsa, Draft 7 güvenli bir seçimdir. Draft 4 ve öncesinden kaçının.

İlk Schema'nızı Yazma

Basit bir örnekle başlayalım: ad, e-posta ve yaş içeren bir kullanıcı nesnesi için Schema.

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://example.com/schemas/user.json",
    "title": "User",
    "description": "A user account in the system",
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The user's full name"
        },
        "email": {
            "type": "string",
            "format": "email",
            "description": "The user's email address"
        },
        "age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 150,
            "description": "The user's age in years"
        }
    },
    "required": ["name", "email"],
    "additionalProperties": false
}

Bu Schema, geçerli bir kullanıcının, name ve email'in zorunlu dize özellikleri olduğu bir nesne olması gerektiğini belirtir. age özelliği isteğe bağlıdır ancak varsa 0 ile 150 arasında bir tamsayı olmalıdır. additionalProperties: false kısıtlaması, Schema'da tanımlanmayan özellikleri engeller, bu da yazım hatalarını ve beklenmeyen alanları yakalar.

Temel Anahtar Kelime Referansı

JSON Schema, kısıtlamaları tanımlamak için zengin bir anahtar kelime dağarcığı sağlar. İşte kategoriye göre düzenlenmiş en önemli anahtar kelimeler.

Tür Anahtar Kelimeleri

Anahtar KelimeAçıklamaÖrnek
typeBeklenen veri türü"type": "string" veya "type": ["string", "null"]
enumİzin verilen değerler listesi"enum": ["active", "inactive", "pending"]
constBu tam değere eşit olmalıdır"const": "v2"

Sayı Kısıtlamaları

Anahtar KelimeAçıklamaÖrnek
minimumMinimum değer (dahil)"minimum": 0
exclusiveMinimumMinimum değer (hariç)"exclusiveMinimum": 0
maximumMaksimum değer (dahil)"maximum": 100
exclusiveMaximumMaksimum değer (hariç)"exclusiveMaximum": 100
multipleOfBu değerin katı olmalıdır"multipleOf": 0.01

Dize Kısıtlamaları

Anahtar KelimeAçıklamaÖrnek
minLengthMinimum dize uzunluğu"minLength": 1
maxLengthMaksimum dize uzunluğu"maxLength": 255
patternDizenin eşleşmesi gereken regex"pattern": "^[A-Z]{2}\\d{4}$"
formatAnlamsal format (email, uri, date-time vb.)"format": "email"

Nesne Kısıtlamaları

Anahtar KelimeAçıklamaÖrnek
propertiesHer bilinen özellik için Schema"properties": {"name": {"type": "string"}}
requiredZorunlu özellikler listesi"required": ["name", "email"]
additionalPropertiesEk özelliklere izin verilip verilmediği"additionalProperties": false
minPropertiesMinimum özellik sayısı"minProperties": 1
maxPropertiesMaksimum özellik sayısı"maxProperties": 10
patternPropertiesRegex ile eşleşen özellikler için Schema"patternProperties": {"^S_": {"type": "string"}}

Dizi Kısıtlamaları

Anahtar KelimeAçıklamaÖrnek
itemsTüm dizi öğeleri için Schema"items": {"type": "string"}
prefixItemsKonumsal öğeler için Schema (Draft 2020-12)"prefixItems": [{"type": "string"}, {"type": "number"}]
minItemsMinimum öğe sayısı"minItems": 1
maxItemsMaksimum öğe sayısı"maxItems": 100
uniqueItemsTüm öğeler benzersiz olmalıdır"uniqueItems": true

Yaygın Schema Desenleri

Gerçek dünya Schema'ları genellikle basit tür kontrolünün ötesine geçen desenler gerektirir. İşte en sık kullanılan desenler.

if/then/else ile Koşullu Doğrulama

Özellik değerlerine göre farklı kısıtlamalar uygulamak için koşullu mantık kullanın. Örneğin, ödeme nesneleri ödeme yöntemine göre farklı alanlar gerektirir.

{
    "type": "object",
    "properties": {
        "method": { "enum": ["credit_card", "bank_transfer"] },
        "card_number": { "type": "string" },
        "routing_number": { "type": "string" }
    },
    "required": ["method"],
    "if": {
        "properties": { "method": { "const": "credit_card" } }
    },
    "then": {
        "required": ["card_number"]
    },
    "else": {
        "required": ["routing_number"]
    }
}

allOf, anyOf, oneOf ile Birleştirme

Birleştirme anahtar kelimeleri, Schema'ları güçlü şekillerde birleştirmenize olanak tanır:

{
    "oneOf": [
        {
            "type": "object",
            "properties": {
                "type": { "const": "email" },
                "address": { "type": "string", "format": "email" }
            },
            "required": ["type", "address"]
        },
        {
            "type": "object",
            "properties": {
                "type": { "const": "phone" },
                "number": { "type": "string", "pattern": "^\\+?[1-9]\\d{1,14}$" }
            },
            "required": ["type", "number"]
        }
    ]
}

$ref ile Schema Yeniden Kullanımı

$ref anahtar kelimesi, Schema'ları referans almanıza ve yeniden kullanmanıza olanak tanır, tekrarı ortadan kaldırır ve Schema'ları bakımı yapılabilir tutar. Aynı belge içindeki veya harici dosyalardaki Schema'lara referans verebilirsiniz.

{
    "$id": "https://example.com/schemas/order.json",
    "type": "object",
    "properties": {
        "customer": { "$ref": "#/$defs/address" },
        "shipping": { "$ref": "#/$defs/address" },
        "billing": { "$ref": "#/$defs/address" },
        "items": {
            "type": "array",
            "items": { "$ref": "#/$defs/lineItem" },
            "minItems": 1
        }
    },
    "required": ["customer", "items"],
    "$defs": {
        "address": {
            "type": "object",
            "properties": {
                "street": { "type": "string" },
                "city": { "type": "string" },
                "zip": { "type": "string", "pattern": "^\\d{5}(-\\d{4})?$" },
                "country": { "type": "string", "minLength": 2, "maxLength": 2 }
            },
            "required": ["street", "city", "zip", "country"]
        },
        "lineItem": {
            "type": "object",
            "properties": {
                "product": { "type": "string" },
                "quantity": { "type": "integer", "minimum": 1 },
                "price": { "type": "number", "exclusiveMinimum": 0 }
            },
            "required": ["product", "quantity", "price"]
        }
    }
}

Nullable Türler

JSON Schema Draft 2020-12'de, nullable türler "null" içeren bir tür dizisi kullanılarak temsil edilir:

{
    "type": ["string", "null"],
    "description": "An optional display name, or null if not set"
}

Daha eski taslaklarda, OpenAPI spesifikasyonu nullable: true anahtar kelimesini kullanıyordu. Standart JSON Schema için her zaman tür dizisi yaklaşımını kullanın.

Format Doğrulaması

format anahtar kelimesi, yapısal kontrolün ötesinde anlamsal doğrulama sağlar. Bir dizenin iyi bilinen bir formata uyması gerektiğini belirtir. Yaygın olarak desteklenen formatlar şunları içerir:

FormatAçıklamaÖrnek
emailE-posta adresiuser@example.com
uriGeçerli URIhttps://example.com/path
uri-referenceURI veya göreli referans/path/to/resource
date-timeISO 8601 tarih-saat2026-05-19T14:30:00Z
dateISO 8601 tarih2026-05-19
timeISO 8601 saat14:30:00Z
ipv4IPv4 adresi192.168.1.1
ipv6IPv6 adresi::1
uuidEvrensel Benzersiz Tanımlayıcı550e8400-e29b-41d4-a716-446655440000
hostnameİnternet ana bilgisayar adıwww.example.com
Önemli Not: Varsayılan olarak, format anahtar kelimesi bir kısıtlama değil açıklamadır. Açıkça format doğrulamasını etkinleştirmediğiniz sürece doğrulayıcı bunu yok sayabilir. Ajv'de, format kontrolünü zorunlu kılmak için { strict: true } veya { validateFormats: true } geçin. Doğrulayıcınızın format kısıtlamalarını uyguladığını her zaman doğrulayın.

Programatik Olarak JSON Verilerini Doğrulama

Schema doğrulaması, uygulama koduna entegre edildiğinde en kullanışlıdır. İşte farklı dillerdeki popüler kütüphaneleri kullanan örnekler.

Ajv ile JavaScript

Ajv, JavaScript'te en yaygın kullanılan JSON Schema doğrulayıcısıdır. Tüm taslak sürümlerini destekler ve Schema'ların JIT derlemesiyle mükemmel performans sunar.

import Ajv from 'ajv';
import addFormats from 'ajv-formats';

const ajv = new Ajv();
addFormats(ajv);

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

const validate = ajv.compile(schema);
const valid = validate({ name: 'Alice', email: 'alice@example.com', age: 30 });

if (!valid) {
    console.log(validate.errors);
    // [{ keyword: 'required', params: { missingProperty: 'email' }, ... }]
}

jsonschema ile Python

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string", "minLength": 1},
        "email": {"type": "string", "format": "email"},
        "age": {"type": "integer", "minimum": 0}
    },
    "required": ["name", "email"],
    "additionalProperties": False
}

try:
    validate(instance={"name": "Alice", "email": "alice@example.com"}, schema=schema)
except ValidationError as e:
    print(f"Validation failed: {e.message}")

API Veri Doğrulaması için JSON Schema

JSON Schema'nın en değerli uygulamalarından biri, API istek ve yanıt verilerini doğrulamaktır. Bu, API'nizin iyi biçimlendirilmiş girdi almasını ve verileri beklenen formatta döndürmesini sağlar, hataları erken yakalar ve istemcilere net hata mesajları sağlar.

Express.js Middleware

import Ajv from 'ajv';

const ajv = new Ajv({ allErrors: true });

function validateBody(schema) {
    const validate = ajv.compile(schema);
    return (req, res, next) => {
        if (!validate(req.body)) {
            return res.status(400).json({
                error: 'Validation failed',
                details: validate.errors
            });
        }
        next();
    };
}

app.post('/api/users',
    validateBody({
        type: 'object',
        properties: {
            name: { type: 'string', minLength: 1, maxLength: 100 },
            email: { type: 'string', format: 'email' },
            role: { enum: ['admin', 'editor', 'viewer'] }
        },
        required: ['name', 'email'],
        additionalProperties: false
    }),
    (req, res) => {
        // req.body is guaranteed valid here
        createUser(req.body);
    }
);

OpenAPI ve JSON Schema

OpenAPI (eski adıyla Swagger), API istek ve yanıt Schema'larını tanımlamak için JSON Schema'nın bir alt kümesini kullanır. Zaten OpenAPI kullanıyorsanız, API spesifikasyonunuzdan Schema'ları çıkarabilir ve çalışma zamanı doğrulaması için kullanabilirsiniz. openapi-schema-validator ve express-openapi-validator gibi araçlar bu süreci otomatikleştirerek API belgelerinizin ve doğrulama mantığınızın her zaman senkronize kalmasını sağlar.

En İyi Uygulamalar

JSON verilerini bir Schema'ya göre doğrulamanız mı gerekiyor? Ücretsiz çevrimiçi JSON Schema doğrulayıcımızı deneyin. Schema'nızı ve verilerinizi yapıştırın, ayrıntılı hata bilgileriyle anında doğrulama sonuçları alın.

JSON Schema DoğrulayıcıJSON Formatlama Aracı

Sıkça Sorulan Sorular

JSON Schema nedir?

JSON Schema, diğer JSON belgelerinin yapısını ve kısıtlamalarını tanımlayan bir JSON belgesidir. Zorunlu alanları, beklenen veri türlerini, değer aralıklarını, dize desenlerini ve iç içe nesne yapılarını tanımlamanıza olanak tanır. Gelen verileri doğrulamak, belge oluşturmak ve otomatik olarak form arayüzleri oluşturmak için kullanabilirsiniz.

Hangi JSON Schema sürümünü kullanmalıyım?

Yeni projeler için JSON Schema Draft 2020-12 kullanın. Bu en son kararlı sürümdür ve Ajv gibi büyük doğrulama kütüphaneleri tarafından desteklenir. Eski araçlarla uyumluluk gerekiyorsa, Draft 7 de yaygın olarak desteklenir. Eski anahtar kelimeler kullandıkları ve modern özelliklerden yoksun oldukları için Draft 4 ve öncesinden kaçının.

JSON Schema ile TypeScript arayüzleri arasındaki fark nedir?

TypeScript arayüzleri yalnızca TypeScript kodunda derleme zamanı tür kontrolü sağlar. JSON Schema, programlama dilleri arasında çalışma zamanı doğrulaması sağlar ve herhangi bir kaynaktan (API istekleri, dosyalar, veritabanları) gelen verileri doğrulayabilir. Geliştirme zamanı güvenliği için TypeScript, sistem sınırlarında çalışma zamanı veri doğrulaması için JSON Schema kullanın.

JSON Schema API istek gövdelerini doğrulayabilir mi?

Evet, JSON Schema API istek ve yanıt doğrulaması için yaygın olarak kullanılır. Express (express-json-validator ile), FastAPI ve Spring Boot gibi framework'ler JSON Schema doğrulamasını doğal olarak veya middleware aracılığıyla destekler. İstek gövdelerini bir Schema'ya göre doğrulamak, gelen verilerin uygulama tarafından işlenmeden önce doğru yapıya sahip olmasını sağlar.

En önemli JSON Schema anahtar kelimeleri nelerdir?

En kritik anahtar kelimeler şunlardır: type (veri türü), properties (nesne alanları), required (zorunlu alanlar), items (dizi öğesi Schema'sı), minimum/maximum (sayısal sınırlar), minLength/maxLength (dize sınırları), pattern (dize regex), enum (izin verilen değerler) ve $ref (Schema yeniden kullanımı için referans). Bu anahtar kelimeler doğrulama ihtiyaçlarının büyük çoğunluğunu karşılar.