JSONバリデーター
高度なオンラインJSON構文バリデーター&スキーマチェッカー — 完全ブラウザ対応でプライバシー重視のツール。
JSONを瞬時に検証する
この無料オンラインJSONバリデーターは、JSONデータの構文エラーや構造上の問題を即座にチェックできます。生のAPIレスポンス、設定ファイル、構造化されたペイロードの検証に最適で、リアルタイムで問題をハイライトし、自動修正も提供します。より厳密な検証にはJSONスキーマを追加し、必須フィールドや特定の型、形式(メール、URIなど)のルールを適用可能です。本ツールはJSONスキーマDraft-07に完全準拠しています。すべての処理はブラウザ内で行われ、データは端末から一切送信されません。
JSON バリデーションとは何ですか?
JSON(JavaScriptオブジェクト記法)は、広く利用されている軽量のデータ交換フォーマットであり、人間にも読みやすく、機械による解析・生成が容易な設計となっています。その主な目的は、オブジェクト、配列、文字列、数値、真偽値、nullといった構造化データを、言語に依存しない形で表現することです。
JSON検証とは、JSONドキュメントが構文的かつ構造的に正しいことをプログラムで確認するプロセスです。これには主に以下の2つのポイントのチェックが含まれます:
- 構文検証: 生のテキストがECMA-404 JSON仕様で定義された正式な文法に従っていることを保証します。ほとんどの現代的なプログラミング言語(例:JavaScriptのJSON.parse()、Pythonのjson.loads()、JavaのJSONDecoder)は有効な構文を期待しており、入力が不正な場合にはエラーを発生させます。
- 構造(スキーマ)検証: 構文を超えて、スキーマ検証はJSONデータが期待される構造に合致しているかを確認します。これにはデータ型、必須プロパティ、値の制約、入れ子のオブジェクトや配列が含まれます。スキーマ検証は通常、JSON Schemaを使用して実施され、どのようなデータが有効と見なされるかのルールを定義します。
なぜJSONを検証するのか?
JSONの検証は、データの送信、保存、またはサービス間通信のためにシリアライズされるあらゆる場面で非常に重要です。主な理由は以下の通りです:
- エラー防止:構文エラー(例:カンマの欠落、対応しない括弧、不正な文字)を早期に検出・報告し、データ処理の前に問題を解決します。
- データの整合性とセキュリティ:不正な形式や悪意のあるJSONペイロードを拒否し、バックエンドのクラッシュ、インジェクション攻撃、データ破損を防止します。
- 型安全性:厳格な型付けを強制し、例えば真偽値が文字列として送信されないようにしたり、UUID・メールアドレス・数値が正しい形式であることを保証します。
- クロスランゲージ互換性:ある環境(例:Node.js)で生成されたJSONが、別の環境(例:Python、Go、Java)で安全に利用できることを保証し、シリアライゼーションやデシリアライゼーションのバグを回避します。
- 保守性と堅牢性: 検証済みのデータ構造はトレーサビリティを向上させ、設定ファイルやログ、APIリクエスト/レスポンスにおけるデバッグ困難なエラーのリスクを低減します。
- プライバシーとセキュリティ:検証は完全にクライアントサイド(ブラウザ内)で行うことができ、ユーザーのデバイスから生データや機密情報が外部に送信されるのを防ぎます。
一般的なJSON検証エラー(詳細な例付き)
引用なしのキー
JSONオブジェクトのすべてのキーは、必ずダブルクオーテーションで囲まれた文字列でなければなりません。
{ name: "アリス" }
{ "name": "アリス" }
多くのJSONに似た形式(例えば、JavaScriptのオブジェクトリテラル)は引用符なしのキーを許可しますが、標準JSONではこれが認められていません。
シングルクォート
JSON文字列はダブルクオートのみを使用する必要があります。シングルクオートは使用できません。
{ 'name': 'ボブ' }
{ "name": "ボブ" }
シングルクォートを使用すると、すべての準拠したJSONライブラリでパーサーエラーが発生します。
末尾のカンマ
オブジェクトや配列の最後の項目の後にコンマを付けないこと。
{ "a": 1, "b": 2, }
{ "a": 1, "b": 2 }
末尾のカンマはJavaScriptでは動作する場合がありますが、厳密なJSONパーサーでは許容されません。
不適切な文字エスケープ
文字列内の引用符や特殊文字は、バックスラッシュを使ってエスケープする必要があります。
{ "quote": "トムが「こんにちは」と言いました" }
{ "quote": "トムが「こんにちは」と言いました" }
その他のエスケープシーケンスには、バックスラッシュを表す\\、改行を表す\n、タブを表す\tがあります。
データ型が正しくありません
数値、ブール値、またはnullには文字列を使用しないでください。
{ "enabled": "有効", "count": "10" }
{ "enabled": true, "count": 10 }
JSONはブール値、数値、文字列を区別します。正しいデータ型を使用することが重要です。
非プリミティブキー
JSONオブジェクトのキーは常に文字列でなければなりません。数値、ブール値、その他の型をキーとして使用することはできません。
{ 123: "abc" }
{ "123": "abc" }
重複したキー
JSON仕様で許可されているものの、重複したキーはバグの一般的な原因です。
{ "name": "アリス", "name": "ボブ" }
ほとんどのパーサーは最後の値(「Bob」)のみを保持し、以前の値は静かに破棄されます。
コメントの活用
標準のJSONではコメントは許可されていませんが、一部のエディターではサポートされています。
{ // ユーザー情報 "name": "アリス" }
{ "name": "アリス" }
スキーマ検証:構造とデータ型の強制
JSONスキーマは、JSONドキュメントの期待される構造を定義し検証するための強力な標準です。これにより、次のことを指定できます:
- 必須項目(`required`)
- データ型(`type`: 文字列、数値、真偽値、オブジェクト、配列、null)
- 文字列フォーマット(`format`:メールアドレス、UUID、日付・時刻など)
- 文字列のパターンマッチング(`pattern`)
- 数値範囲(`最小値`、`最大値`)
- 配列の長さとアイテムの検証(`minItems`、`maxItems`、`items`)
- オブジェクトと配列のネストされたバリデーション
- 列挙制約(`enum`)
例:ユーザースキーマ(ドラフト07版)
{ "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string", "minLength": 1 }, "email": { "type": "string", "format": "email" }, "is_active": { "type": "boolean" } }, "required": ["id", "name", "email"], "additionalProperties": false }
これが実現すること:
- IDは有効なUUID文字列である必要があります。
- 名前は空でない文字列でなければなりません。
- メールアドレスは標準的な形式で入力してください。
- is_active(任意)はブール値でなければなりません。
- 上記で定義されたもの以外のプロパティは許可されていません。
実践例:Stripe APIレスポンスの検証方法
Stripe API(例:PaymentIntent)からのJSONレスポンスを受け取る場合、スキーマ検証により不完全または型が誤っているデータの処理を防げます。
{ "type": "オブジェクト", "properties": { "id": { "type": "文字列", "pattern": "^pi_" }, "object": { "type": "文字列", "const": "payment_intent" }, "amount": { "type": "整数", "minimum": 1 }, "currency":{ "type": "文字列", "minLength": 3, "maxLength": 3 }, "status": { "type": "文字列", "enum": [ "支払い方法を必要とする", "確認が必要", "処理中", "成功済み", "キャンセル済み" ]} }, "required": ["id", "object", "amount", "currency", "status"], "additionalProperties": false }
- IDは「pi_」で始まる必要があります
- オブジェクトは常に「payment_intent」でなければなりません
- 金額は1以上の整数でなければなりません
- 通貨は3文字の文字列でなければなりません(例:「usd」「eur」)
- ステータスは指定された値のいずれかでなければなりません
メリット
- 早期エラー検出:ビジネスロジックに影響を及ぼす重大なAPI変更や不完全なデータを事前にキャッチします。
- 自動テスト:CI/CDパイプラインでスキーマを活用し、実際およびモックレスポンスの検証を実現
- チーム間の一貫性:フロントエンド、バックエンド、サードパーティAPI間のデータ契約を標準化し、信頼性の高い連携を実現します。
正確なJSONバリデーションは、構文とスキーマの両方を網羅し、微細なバグを防ぎ、ベストプラクティスを徹底し、不正または悪意のある入力からアプリケーションを保護します。設定ファイル、APIペイロード、サービス間メッセージングのいずれにおいても、堅牢なバリデーションは現代のソフトウェアシステムの基盤です。
プライバシーとセキュリティ
すべての検証とスキーマチェックはブラウザ内でローカルに実行されます。データはアップロードや記録されることはありません。あなたのJSONは完全にプライベートに保たれます。
JSON検証のコード例
組み込みライブラリや人気のフレームワークを使用して、さまざまなプログラミング言語でJSONを検証する方法をご紹介します。これらの例では、構文検証とスキーマ検証の両方を解説しています。
const jsonString = '{"name":"Alice","age":30}';
try {
const obj = JSON.parse(jsonString);
console.log("Valid JSON:", obj);
} catch (e) {
console.error("Invalid JSON!", e.message);
}
const Ajv = require("ajv");
const ajv = new Ajv();
const schema = { type: "object", properties: { age: { type: "integer" } }, required: ["age"] };
const data = { age: 30 };
const validate = ajv.compile(schema);
console.log(validate(data) ? "Valid!" : ajv.errorsText(validate.errors));
import json
try:
obj = json.loads('{"name":"Alice","age":30}')
print("Valid JSON:", obj)
except json.JSONDecodeError as e:
print("Invalid JSON:", e)
import json, jsonschema
schema = {
"type": "object",
"properties": { "age": { "type": "integer" } },
"required": ["age"]
}
data = {"age": 30}
try:
jsonschema.validate(data, schema)
print("Valid!")
except jsonschema.ValidationError as e:
print("Schema validation error:", e)
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte(`{"name":"Alice","age":30}`)
var obj map[string]interface{}
if err := json.Unmarshal(data, &obj); err != nil {
fmt.Println("Invalid JSON:", err)
} else {
fmt.Println("Valid JSON:", obj)
}
}
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
String json = "{"name":"Alice","age":30}";
try {
Object obj = new ObjectMapper().readTree(json);
System.out.println("Valid JSON: " + obj);
} catch (Exception e) {
System.out.println("Invalid JSON: " + e.getMessage());
}
}
}
using System;
using System.Text.Json;
class Program {
static void Main() {
string json = "{"name":"Alice","age":30}";
try {
var doc = JsonDocument.Parse(json);
Console.WriteLine("Valid JSON!");
} catch (JsonException e) {
Console.WriteLine("Invalid JSON: " + e.Message);
}
}
}
<?php
$json = '{"name":"Alice","age":30}';
$obj = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
echo "Valid JSON";
} else {
echo "Invalid JSON: " . json_last_error_msg();
}
require 'json'
begin
obj = JSON.parse('{"name":"Alice","age":30}')
puts "Valid JSON!"
rescue JSON::ParserError => e
puts "Invalid JSON: #{e.message}"
end
echo '{"name":"Alice","age":30}' | jq empty && echo "Valid" || echo "Invalid"
fn main() {
let data = r#"{"name":"Alice","age":30}"#;
match serde_json::from_str::<serde_json::Value>(data) {
Ok(_) => println!("Valid JSON!"),
Err(e) => println!("Invalid JSON: {}", e),
}
}
import org.json.JSONObject
fun main() {
try {
val obj = JSONObject("{\"name\":\"Alice\",\"age\":30}")
println("Valid JSON: $obj")
} catch (e: Exception) {
println("Invalid JSON: ${e.message}")
}
}
import Foundation
let json = "{\"name\":\"Alice\",\"age\":30}"
if let data = json.data(using: .utf8) {
do {
let _ = try JSONSerialization.jsonObject(with: data)
print("Valid JSON!")
} catch {
print("Invalid JSON: \(error)")
}
}
const jsonString = '{"name":"Alice","age":30}';
try {
const obj = JSON.parse(jsonString);
console.log("Valid JSON:", obj);
} catch (e) {
console.error("Invalid JSON!", e.message);
}
SELECT '{"name":"Alice","age":30}'::jsonb; -- Will error if not valid JSON
SELECT JSON_VALID('{"name":"Alice","age":30}');
$json = '{"name":"Alice","age":30}'
try {
$obj = $json | ConvertFrom-Json
Write-Output "Valid JSON!"
} catch {
Write-Output "Invalid JSON: $($_.Exception.Message)"
}
use JSON;
my $str = '{"name":"Alice","age":30}';
eval { decode_json($str) };
print $@ ? "Invalid JSON: $@" : "Valid JSON!";
import 'dart:convert';
void main() {
const jsonString = '{"name":"Alice","age":30}';
try {
final obj = jsonDecode(jsonString);
print('Valid JSON: $obj');
} catch (e) {
print('Invalid JSON: $e');
}
}
json = ~s({"name":"Alice","age":30})
case Jason.decode(json) do
{:ok, _} -> IO.puts("Valid JSON!")
{:error, err} -> IO.puts("Invalid JSON: #{err}")
end
import play.api.libs.json._
object Main extends App {
val str = """{"name":"Alice","age":30}"""
try {
val json = Json.parse(str)
println("Valid JSON!")
} catch {
case e: Exception => println("Invalid JSON: " + e.getMessage)
}
}
このツールについて
このツールは、世界中で数百万のユーザーに利用されている高速かつプライバシー重視のオンラインユーティリティを幅広く提供するItself Toolsのチームによって開発されました。シンプルさ、速度、信頼性を最優先にしたブラウザベースのツール構築に長年の経験を持ち、プログラマーやアナリスト、デジタル専門家の技術的な作業を簡単にするために開発者向けアプリケーション分野にも展開しています。