新着記事を見逃さないには?
このブログ一覧をブックマークし、ホームやツール一覧のガイド欄もご覧ください。記事の閲覧に登録やメール購読は不要です。
引用符、カンマ、括弧、エスケープ、不正な値、重複キー、大きな整数など、よくあるJSONエラーを例と修正手順付きで解説します。
JSONは単純に見えますが、引用符、カンマ、バックスラッシュが一つ違うだけで、文書全体を解析できなくなることがあります。パーサーが示すのは処理を続けられなくなった位置であり、実際に間違えた位置とは限りません。
このガイドでは、APIレスポンス、設定ファイル、ログでよく発生するJSONエラーを整理します。まず JSONバリデーター で最初のエラーを特定してください。JSONに近い形式なら JSON修復ツール で修正候補を作り、変更内容を確認します。処理はすべてブラウザー内で行われます。
基本原則:元の入力を保存し、最初のエラーから一つずつ直して、そのたびに再検証します。
JSONで使えるのは、オブジェクト、配列、文字列、数値、真偽値、null です。キーと文字列はダブルクォートで囲みます。コメント、undefined、NaN、関数、日付オブジェクトはJSONではありません。
| 症状 | 主な原因 | 最初に確認する場所 |
|---|---|---|
Unexpected token | 不正な文字、シングルクォート、引用符のないキー | 表示位置付近の引用符 |
Unexpected end of JSON input | 閉じ記号の不足、入力の途中切れ | ファイルやレスポンスの末尾 |
Expected ',' or '}' | プロパティ間のカンマ不足 | 直前の値の末尾 |
Bad control character | 文字列内の未エスケープ改行やタブ | バックスラッシュと制御文字 |
| 解析できるが値が変わる | 重複キー、大きすぎる整数 | 型とデータの意味 |
JavaScriptオブジェクトではシングルクォートや引用符のないキーを使えますが、標準JSONでは使えません。
{ name: 'Alice', 'role': 'admin' }正しいJSON:
{ "name": "Alice", "role": "admin" }文書内のシングルクォートをすべて一括置換しないでください。文字列中のアポストロフィやエスケープまで壊す可能性があります。
{
"name": "Alice"
"active": true
}直前の値の末尾にカンマを追加します。
{
"name": "Alice",
"active": true
}Expected ',' が出たら、表示された文字だけでなく、その直前の完全な値を確認します。配列要素でも同じ規則です。
標準JSONでは、最後のプロパティや配列要素の後にカンマを置けません。
{
"name": "Alice",
"active": true,
}true の後のカンマを削除し、JSON整形ツール で再解析すると、構文とインデントを同時に確認できます。
Unexpected end of JSON input は、オブジェクト、配列、文字列が閉じる前に入力が終わったことを示します。ネットワークレスポンスやコピーしたログが途中で切れている場合もあります。
{
"user": {
"name": "Alice",
"tags": ["admin", "editor"]
}この例では外側の } が不足しています。ただしAPIデータの場合、すぐに括弧を補わず、レスポンス全体が届いたか確認してください。ツールは構文を閉じられても、失われたフィールドは復元できません。
JSONでは、引用符、バックスラッシュ、改行、タブをそれぞれ \"、\\、\n、\t と記述します。Windowsパスや正規表現は特に注意が必要です。
不正:
{
"path": "C:\new\reports",
"message": "He said "hello""
}修正後:
{
"path": "C:\\new\\reports",
"message": "He said \"hello\""
}文字列内に実際の改行を直接入れることもできません。必要なら \n を使います。
標準JSONは // と /* ... */ コメントをサポートしません。コメントを削除するか、必要な説明を明示的なフィールドに移します。単純な正規表現で // 以降を削除すると、https:// のURLまで壊すため危険です。
真偽値とnullは小文字の true、false、null だけです。Pythonの True、False、None、JavaScriptの undefined、NaN、Infinity は無効です。
{ "active": True, "nickname": None, "score": NaN }修正候補:
{ "active": true, "nickname": null, "score": null }ただし NaN を null、文字列、フィールド削除のどれにするかは、業務仕様で決める必要があります。
ログでは、1行に1オブジェクトを置くNDJSON/JSON Linesがよく使われます。各行が正しくても、全文は一つのJSON文書ではありません。
{"id": 1, "status": "ok"}
{"id": 2, "status": "failed"}標準JSONが必要なら、オブジェクト間にカンマを置いて配列にします。
[
{"id": 1, "status": "ok"},
{"id": 2, "status": "failed"}
]解析結果がバックスラッシュだらけの長い文字列なら、データが二度シリアライズされた可能性があります。
"{\"name\":\"Alice\",\"active\":true}"1回目の解析では文字列、2回目でオブジェクトになります。通常は生成側でシリアライズを1回に直しますが、JSON文字列を保存する契約かどうかも確認してください。
{
"role": "user",
"role": "admin"
}多くのパーサーは最後の値を残しますが、言語やセキュリティ層によって動作が異なる場合があります。入力時に重複キーを拒否し、生成側を修正してください。通常の JSON.parse の後では、上書きされた値はすでに失われています。
JavaScriptの Number は 9007199254740991 を超えるすべての整数を正確に表現できません。データベースIDなどが解析時に変わることがあります。
{ "userId": 9007199254740993 }識別子は文字列で送る方が安全です。
{ "userId": "9007199254740993" }すでに丸められた数値を後から文字列にしても、元の桁は復元できません。
決済、権限、医療、監査、移行データを無人で自動修正しないでください。ツールは明確な構文エラーを直せますが、欠損値や業務上の意味は推測できません。
JSONエラーの多くは、引用符、カンマ、括弧、エスケープ、非標準値が原因です。元データを残し、最初のエラーから一つずつ直して再検証します。解析後も、重複キー、大きな整数、型、意味を確認してください。JSONに近い入力は JSON修復ツール で候補を作り、JSONバリデーター と JSON Diff で独立して確認できます。
開発者に最高のJSON処理ツールを提供することに専念
さらに多くの投稿が近日公開予定...
ブログに戻る更新の追い方、扱うトピック、リクエストについて。
このブログ一覧をブックマークし、ホームやツール一覧のガイド欄もご覧ください。記事の閲覧に登録やメール購読は不要です。
JSON の検証・整形・変換・デバッグの流れと JSON Work の更新で、サイト上の無料ツールがブラウザ内でできることと対応づけています。
はい。About の連絡先や GitHub からどうぞ。実務の統合やデバッグに直結するテーマを優先しています。