ToolHub
View All Posts

JSON Schema 検証ガイド:検証するあなたのデータ構造

各から外部ソース受信するデータのアプリケーションすべて面临同一つの根本问题:私できる信頼これらのデータか?にかかわらずは API リクエストする体、設定ファイル、キューメッセージそれともデータインポート,できない信のデータで入入系统前にすべて必須を経て検証する。JSON Schema 提供するた一種の標準化の、と言語非依存の方式来定義する有効データの样子,かつ検証する传入データはいいえ適合する该定義する。このガイドではたから编写第一つの Schema まで複雑検証するの高级パターンのすべての内容,かつ提供するたできる直ちに適用するの実用的な例。

とは JSON Schema?

JSON Schema は一つの説明する其彼 JSON ドキュメント结构と制約の JSON ドキュメント。それは一種の許可するあなた注解と検証する JSON データの词汇表,由互联网工程任务组(IETF)標準化。JSON Schema 定義するたについて必須存でどの字段、それ们必須とは何かタイプ、どの值は可受け取るのならびにオブジェクトと配列应どのように结构の规すなわち。

を JSON Schema したい象成あなたのデータ契約。すぐにのようなデータベース Schema 定義するた表の列、タイプと制約一样,JSON Schema 定義するた JSON ドキュメントの属性、タイプと制約。任意の満たす Schema 中すべての制約の JSON データと呼ばれる有効インスタンス,そして違反する任意の制約のデータすなわちは無効の。

JSON Schema とは異なるもの

JSON Schema バージョン

JSON Schema 经历た多个草案の演入,各草案すべて追加するた機能かつ完善た词汇表。理解するこれらのバージョンに役立つあなたのために项目選択する適切のバージョンかつ避ける互換性问题。

バージョン$schema URIステート主な機能
Draft 2020-12https://json-schema.org/draft/2020-12/schema現在のバージョンprefixItems, dynamicRef, 词汇表支持する
Draft 2019-09https://json-schema.org/draft/2019-09/schema安定版unevaluatedProperties, $recursiveRef
Draft 7http://json-schema.org/draft-07/schema#広くサポートif/then/else, contentEncoding
Draft 6http://json-schema.org/draft-06/schema#旧バージョンpropertyNames, contains
Draft 4http://json-schema.org/draft-04/schema#非推奨最初に広く採用されたバージョン
提案する:新規项目使用 Draft 2020-12。それは最も新規安定版本,機能最も多,受主に検証するライブラリ支持する。もし必要とすると现ありツールの最大互換性,Draft 7 は安全の選択する。避ける使用 Draft 4 およびより早バージョン。

初めてのSchema作成

させる私たちから一つの簡単の例子開始する:一つのを含む姓名、メールと年龄の用户オブジェクトの 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
}

此 Schema 声明た一つの有効用户必須は一つのオブジェクト,其中 name と email は必需の文字列属性。age 属性は可选の,しかしもし存ですなわち必須は 0 まで 150 の間の全体数。additionalProperties: false 制約阻止た任意の未で Schema 中定義するの属性,これできる捕获拼写間違いと意外字段。

コアキーワードリファレンス

JSON Schema 提供するた丰富の閉键字词汇表来定義する制約。もって下按カテゴリ组织の最も重要の閉键字。

型キーワード

閉键字説明する
type期待されるデータ型"type": "string" または "type": ["string", "null"]
enum許可された値のリスト"enum": ["active", "inactive", "pending"]
constこの正確な値と等しい必要がある"const": "v2"

数値制約

閉键字説明する
minimum最小値(含む)"minimum": 0
exclusiveMinimum最小値(含まない)"exclusiveMinimum": 0
maximum最大値(含む)"maximum": 100
exclusiveMaximum最大値(含まない)"exclusiveMaximum": 100
multipleOfこの値の倍数である必要がある"multipleOf": 0.01

文字列制約

閉键字説明する
minLength最小文字列長"minLength": 1
maxLength最大文字列長"maxLength": 255
pattern文字列がマッチする必要がある正規表現"pattern": "^[A-Z]{2}\\d{4}$"
formatセマンティックフォーマット(email、uri、date-time など)"format": "email"

オブジェクト制約

閉键字説明する
properties各既知プロパティのSchema"properties": {"name": {"type": "string"}}
required必須プロパティリスト"required": ["name", "email"]
additionalProperties追加プロパティを許可するか"additionalProperties": false
minProperties最小プロパティ数"minProperties": 1
maxProperties最大プロパティ数"maxProperties": 10
patternProperties正規表現にマッチするプロパティのSchema"patternProperties": {"^S_": {"type": "string"}}

配列制約

閉键字説明する
items全配列アイテムのSchema"items": {"type": "string"}
prefixItems位置指定アイテムのSchema(Draft 2020-12)"prefixItems": [{"type": "string"}, {"type": "number"}]
minItems最小アイテム数"minItems": 1
maxItems最大アイテム数"maxItems": 100
uniqueItems全アイテムが一意である必要がある"uniqueItems": true

よくあるSchemaパターン

现实世界中の Schema 通常必要とする超越簡単型チェックのパターン。もって下は最も常用のパターン。

if/then/else による条件付き検証

使用条件逻辑に基づいて属性值適用する異なるの制約。例えば,支付オブジェクトに基づいて支付方式必要とする異なるの字段。

{
    "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 による組み合わせ

コンポジット閉键字許可するあなたもって強力の方式コンポジット Schema:

{
    "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 によるSchemaの再利用

$ref 閉键字許可するあなた引用すると复用 Schema,消除重复かつ保持 Schema のメンテナンス可能性。あなたできる引用する同一ドキュメント内または外部ファイル中の Schema。

{
    "$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型

で JSON Schema Draft 2020-12 中,nullable型使用を含む "null" のタイプ配列来表示:

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

で较早の草案中,OpenAPI 仕様使用た nullable: true 閉键字。に対して標準 JSON Schema,请常に使用タイプ配列方法。

フォーマット検証

format 閉键字提供するた超越结构確認するの语义検証する。それ指定文字列必須適合する一種の众所周知のフォーマット。常用支持するのフォーマットを含む:

フォーマット説明する
emailメールアドレスuser@example.com
uri有効なURIhttps://example.com/path
uri-referenceURI または相対参照/path/to/resource
date-timeISO 8601 日時2026-05-19T14:30:00Z
dateISO 8601 日付2026-05-19
timeISO 8601 時刻14:30:00Z
ipv4IPv4アドレス192.168.1.1
ipv6IPv6アドレス::1
uuidUUID550e8400-e29b-41d4-a716-446655440000
hostnameインターネットホスト名www.example.com
重要な注意点:默认情况下,format 閉键字は注解そして非制約。検証する器かもしれないできる無視するそれ,でない限りあなた明確に有効化フォーマット検証。で Ajv 中,传递 { strict: true } または { validateFormats: true } 来強制フォーマット確認する。常に検証するあなたの検証する器はいいえ強制実行するフォーマット制約。

プログラムによる検証 JSON データ

Schema 検証するで統合するまでアプリケーションコード中时最ものためにあり用。もって下は使用異なる言語中ストリーム行ライブラリの例。

JavaScript で Ajv を使用

Ajv は JavaScript 中使用最も広くの JSON Schema バリデーター。それ支持するすべての草案バージョン,かつを通じて Schema の JIT コンパイル提供する出色のパフォーマンス。

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' }, ... }]
}

Python で jsonschema を使用

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}")

使用 JSON Schema 入行 API データ検証

JSON Schema 最も価値があるの適用するの一つは検証する API リクエストすると対応データ。これは以下を保証しますたあなたの API 受信するフォーマット良良の入力するかつもって预期フォーマット戻るデータ,できるおよび早捕获間違いかつへクライアント明確なエラーメッセージを提供。

Express.js ミドルウェア

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 と JSON Schema

OpenAPI(前身のために Swagger)使用 JSON Schema の一つの子集来定義する API リクエストすると対応 Schema。もしあなたすでにで使用 OpenAPI,できるから API 仕様中提取 Schema かつする其に使用される実行する时検証する。のような openapi-schema-validator と express-openapi-validator これ样のツールできる自動化するこのたことがある程,確保するあなたの API ドキュメントと検証する逻辑常に保持同期する。

ベストプラクティス

必要とするに基づいて Schema 検証する JSON データ?無料のオンライン JSON Schema バリデーター。貼り付けるあなたの Schema とデータ,即可獲得する带あり詳細間違い情報の即時検証する結果。

JSON Schema バリデーターJSONフォーマッター

よくある質問

とは JSON Schema?

JSON Schema は一つの説明する其彼 JSON ドキュメント结构と制約の JSON ドキュメント。それさせるあなたできる定義する必需字段、期待されるデータ型、值範囲、文字列パターンと嵌套オブジェクト结构。あなたできる用それ来検証する传入データ、生成ドキュメントと自动作成する表単界面。

私使用すべきどのバージョンの JSON Schema?

新規项目请使用 JSON Schema Draft 2020-12。これは最も新規の安定版本,Ajv など主に検証するライブラリすべて支持するそれ。もし必要とすると旧ツール兼容,Draft 7 もられる広くサポート。避ける使用 Draft 4 およびより早バージョン,なぜならそれ们使用たことがある时の閉键字かつ缺乏现代機能。

JSON Schema と TypeScript インターフェース違いは何か?

TypeScript インターフェース仅で TypeScript コード中提供するコンパイル时型チェック。JSON Schema 提供する跨プログラミング言語の実行する时検証する,できる検証する来自任意のソース(API リクエストする、ファイル、データベース)のデータ。使用 TypeScript 獲得する開発する时の安全性,使用 JSON Schema で系统边界入行実行する时データ検証。

JSON Schema できる検証する API リクエストする体か?

はい,JSON Schema られる広くに使用される API リクエストすると対応検証する。Express(配合 express-json-validator)、FastAPI と Spring Boot などフレームワークネイティブサポートまたはを通じてミドルウェア支持する JSON Schema 検証。に基づいて Schema 検証するリクエストする体可確保する传入データでアプリケーション処理する前にを持つ正しくの结构。

最も重要の JSON Schema 閉键字ありどの?

最も閉键の閉键字は:type(データタイプ)、properties(オブジェクト字段)、required(必需字段)、items(配列元素 Schema)、minimum/maximum(数值边界)、minLength/maxLength(文字列边界)、pattern(文字列正規表現)、enum(許可するの值)と $ref(复用 Schema の引用する)。これらの閉键字オーバーライドた绝大多数の検証する需求。