← 記事一覧

JSON を検証する方法: 構文と schema 検証

JSON.parse、Python の json.loads、jq、またはブラウザで JSON 構文を検証 —— さらに JSON Schema で構造と型を検査する方法を学ぶ。

JSON のバリデーションとは、文字列が構文的に正しい(JSON 文法に従う)こと、加えてオプションで構造的に正しい(アプリが期待する形と一致する)ことを確認することです。本ガイドでは JavaScript、Python、コマンドライン、ブラウザで JSON を検証する方法を示し、構文バリデーションとスキーマバリデーションの決定的な違いを説明します。

JSON バリデーションの 2 種類

何かを検証する前に、自分が本当に問うているのはどちらかを決めましょう:

  • 構文バリデーション —— 「これは妥当な JSON か?」JSON 文法に対してクォート、カンマ、括弧、値型をチェックします。JSON.parse() がこれを行います。
  • スキーマバリデーション —— 「この JSON は正しいフィールド、型、制約を持つか?」id が整数か、email が存在するかなどをチェック。これには JSON Schema と Ajv のようなバリデータが必要です。

「validate JSON」という検索の多くは構文バリデーションを指します —— そこから始めましょう。

JavaScript で JSON を検証

最もシンプルで信頼できる構文チェックは、パースを試して例外を捕捉することです。JSON.parse() は無効な入力に対して SyntaxError を投げます:

function isValidJson(text) {
  try {
    JSON.parse(text);
    return true;
  } catch {
    return false;
  }
}

isValidJson('{"name":"Ada"}');  // true
isValidJson("{'name':'Ada'}");  // false —— シングルクォート
isValidJson('{"a":1,}');        // false —— 末尾カンマ

無効な理由が必要なら、エラーメッセージを保持してください —— 通常は位置情報を含みます:

function validateJson(text) {
  try {
    return { valid: true, value: JSON.parse(text) };
  } catch (err) {
    return { valid: false, error: err.message };
  }
}

validateJson('{"a":1,}');
// { valid: false, error: "Expected double-quoted property name in JSON at position 7" }

JSON を正規表現で検証してはいけません。JSON は再帰的な文法で、正規表現では正しく検証できません —— JSON.parse() が公式のバリデータで、すべての JavaScript ランタイムに組み込まれています。

Python で JSON を検証

Python の json.loads() は無効な入力に対して json.JSONDecodeError を投げ、正確な行・列を返します:

import json

def is_valid_json(text):
    try:
        json.loads(text)
        return True
    except json.JSONDecodeError as e:
        print(f"Invalid JSON: {e.msg} at line {e.lineno} column {e.colno}")
        return False

is_valid_json('{"name": "Ada"}')   # True
is_valid_json('{"name": "Ada",}')  # False —— 末尾カンマ

コマンドラインで JSON ファイルを検証

jq で

jq は入力が妥当な JSON でないと非ゼロで終了するので、スクリプトや CI に最適です:

# 妥当なら何も出力せず 0;無効なら出力して非ゼロ
jq empty data.json && echo "valid" || echo "invalid"

Python で(インストール不要)

python3 -m json.tool data.json > /dev/null && echo "valid"

CI パイプラインで

リポジトリ内のすべての JSON ファイルを pre-commit や CI ステップで検証し、不正な設定が本番に届かないようにします:

# 妥当でない .json があればビルドを失敗
find . -name '*.json' -not -path './node_modules/*' \
  -exec sh -c 'jq empty "$1" || exit 255' _ {} \;

ブラウザで JSON を検証

コードなしで素早く確認したいなら、JSON を fixjson の JSON バリデータ に貼ってください。入力に応じて構文エラーの正確な行と位置を即座に報告し、すべてローカルで動作します —— サーバへ送信されないので、機密ペイロードでも安全です。JSON が壊れていて修復したいなら、JSON Fix が一般的なエラーを自動修正します。

構文を超えて:JSON Schema で構造を検証

構文的に妥当な JSON でもアプリにとっては間違い であり得ます —— 必須フィールドの欠落、数値であるべき場所が文字列、範囲外の値など。構造を強制するには JSON Schema で期待する形を記述し、Ajv(JavaScript)または jsonschema ライブラリ(Python)で検証します:

import Ajv from 'ajv';

const ajv = new Ajv();
const validate = ajv.compile({
  type: 'object',
  required: ['id', 'email'],
  properties: {
    id:    { type: 'integer' },
    email: { type: 'string' },
  },
});

validate({ id: 42, email: 'a@b.com' }); // true
validate({ id: '42' });                 // false —— 型エラー & email 欠落
// validate.errors に詳細

コマンドラインでのスキーマ検証

CI で JSON をスキーマに対して検証する場合、2 つの CLI で多くの用途をカバーできます:

# Python —— 一度だけインストール
pip install jsonschema
jsonschema --instance data.json schema.json && echo OK

# Node —— Ajv の CLI
npm i -g ajv-cli ajv-formats
ajv validate -c ajv-formats -s schema.json -d "data.*.json"

コミットごとに JSON を検証(pre-commit フック)

未検証の JSON のコミットを根本から防ぐには、husky + lint-staged でフックを設定:

// package.json
{
  "lint-staged": {
    "*.json": [
      "jq empty",
      "ajv validate -s schemas/$name.schema.json -d"
    ]
  }
}

# フックをインストール
npx husky add .husky/pre-commit "npx lint-staged"

Python プロジェクトでは、公式の pre-commit フレームワークに check-json フックが組み込まれており、各ステージのファイルに対して json.loads を実行します。

よくある JSON バリデーションエラー

検証が失敗するとき、原因はほぼ常にこれらのどれかです —— それぞれ専用のガイドがあります:

よくある質問

文字列が妥当な JSON かどうか確認するには?

try/catchJSON.parse()(JavaScript)、または try/exceptjson.loads()(Python)に渡します。例外が出なければ妥当です。コードなしのチェックは ブラウザバリデータ で。

JSON を正規表現で検証できますか?

いいえ。JSON は再帰文法で正規表現では正しく表現できません。常に本物のパーサを使ってください —— JSON.parse()

JSON の検証とパースの違いは?

パースはテキストを使える値に変えるもの、検証はパースができる ことを確認するもの。実務上、パースの成功がそのまま検証です —— 同じ操作で、妥当性だけ気にする時は結果を捨てるだけです。

スキーマに対して JSON を検証するには?

JSON Schema を Ajv(JavaScript)または jsonschema ライブラリ(Python)と組み合わせて使います。スキーマ検証は型、必須フィールド、制約をチェックします —— 構文だけではありません。

今すぐ JSON を検証 —— セットアップ不要

JSON を JSON バリデータ に貼って、構文エラーと正確な行・位置を即座に確認できます。すべてブラウザで動作し、データはマシンを離れません。