How to Fix Invalid JSON: Common Errors & Solutions
Diagnose and fix the 10 most common JSON errors developers encounter. Each error includes before/after code examples and a clear explanation of why it happens.
JSON解析が失敗する理由
JSONはシンプルに見えますが、実際にはその厳密さが人々を混乱させる原因となります。JavaScriptのオブジェクトリテラルとは異なり、JSONは構文のショートカットに対してゼロトレランスです。末尾のカンマは許可されていません。シングルクオートも使用できません。コメントも不可です。すべての逸脱はパースエラーを引き起こし、エラーメッセージはしばしば役に立ちません:Unexpected tokenやJSON.parse: expected ',' or '}'が1行目に表示されます。
このガイドでは、開発者が実際に遭遇する最も一般的な10のJSONエラーをカバーします。各エラーには壊れたJSON、パーサーがそれを拒否する理由、および修正されたバージョンが含まれています。このページをブックマークしてください — きっと再訪することになるでしょう。
自分で試してみてください: 壊れたJSONを私たちのJSON修復ツールに貼り付けて、これらのエラーのほとんどを瞬時に自動修正してください。
エラー1:末尾のカンマ
これは最も一般的なJSONエラーです。JavaScriptではオブジェクトや配列に末尾のカンマが許可されているため、開発者は自然に同じようにJSONを書きます。しかし、JSONではそれを許可していません。
壊れた:
{
"name": "Alice",
"age": 30,
}
修正済み:
{
"name": "Alice",
"age": 30
}
30の後の末尾のカンマが、パーサーに別のキーと値のペアを期待させます。閉じ括弧が見つかると、エラーをスローします。すべてのオブジェクトと配列の最後のアイテムの後のカンマを削除してください。
エラー2:シングルクオートの代わりにダブルクオート
JSONでは、キーと文字列の値の両方にダブルクオートが必要です。シングルクオートはJavaScriptの特性であり、JSONパーサーはそれを完全に拒否します。
壊れた:
{
'name': 'Alice',
'city': 'Portland'
}
修正済み:
{
"name": "Alice",
"city": "Portland"
}
これは、JavaScriptコードからオブジェクトリテラルをコピーしたり、シングルクオートを使用するPython辞書からコピーしたりする際に最もよく発生します。'を"に置き換えることで修正できますが、アポストロフィを含む文字列には注意が必要です — それらはエスケープする必要があります。
エラー3:引用されていないキー
JavaScriptでは、{ name: "Alice" }のようにキーを引用せずに書くことができますが、JSONではできません。すべてのキーはダブルクオートで囲まれた文字列でなければなりません。
壊れた:
{
name: "Alice",
age: 30
}
修正済み:
{
"name": "Alice",
"age": 30
}
これは通常、誰かが手動でJSONを書いたり、JavaScriptオブジェクトをコピーしたりする際に発生します。一部のエディタやAPIデバッグツールは、引用されていないキーを喜んで表示し、他の場所でファイルをパースしようとするまで問題を隠蔽します。
エラー4:JSON内のコメント
JSONはコメントをサポートしていません — //の単一行コメントも、/* */のブロックコメントもありません。これは、特に設定ファイルにとって非常にフラストレーションの多い制限の一つです。
壊れた:
{
// データベース設定
"host": "localhost",
"port": 5432 /* デフォルトのPostgreSQLポート */
}
修正済み:
{
"host": "localhost",
"port": 5432
}
設定ファイルにコメントが必要な場合は、VS CodeやTypeScriptがネイティブにサポートしているJSONC(コメント付きJSON)を使用するか、YAMLやTOMLに切り替えることを検討してください。標準のJSONでは、パースする前にすべてのコメントを削除してください。
エラー5:アイテム間のカンマが欠落
JSONオブジェクトに新しいフィールドを追加する際、前のフィールドとの間にあるカンマを忘れるのは簡単です。パーサーは、区切りなしに2つの連続する値を見て、エラーを引き起こします。
壊れた:
{
"name": "Alice"
"age": 30
}
修正済み:
{
"name": "Alice",
"age": 30
}
エラーメッセージは通常、欠落したカンマの後の行を指し示すため、誤解を招くことがあります。Unexpected stringやExpected commaが表示された場合は、報告された位置の上の行を確認してください。
エラー6:閉じ括弧または波括弧が欠落
大きなJSONファイルでは、不一致の括弧を見つけるのは難しいです。[または{が閉じられていないと、パーサーは構造の意図された終わりを超えて読み続け、実際の問題から遠く離れた混乱したエラーを生成します。
壊れた:
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
}
修正済み:
{
"users": [
{ "name": "Alice" },
{ "name": "Bob" }
]
}
修正方法:括弧のマッチングを行うエディタを使用する(VS Codeはマッチするペアをハイライトします)か、JSONバリデーターを使用して不一致の正確な位置を報告させます。
エラー7:undefined、NaN、またはInfinity
これらは有効なJavaScriptの値ですが、JSONには表現がありません。JSON.stringifyはundefinedを静かにnullに変換します(またはキーを完全に省略します)が、これらの値を手動で書くと、パーサーはそれを拒否します。
壊れた:
{
"score": NaN,
"callback": undefined,
"limit": Infinity
}
修正済み:
{
"score": null,
"callback": null,
"limit": null
}
undefinedとNaNをnullに置き換えるか、値の欠如が意味的に適切であればキーを完全に省略してください。Infinityについては、センチネル数または"Infinity"のような文字列表現を使用し、アプリケーションコード内で処理することを検討してください。
エラー8:配列の最後のアイテムの後の余分なカンマ
これはエラー1の配列版です。特にアイテムを削除したり再配置したりした後に、手動で編集されたJSONファイルで常に表示されます。
壊れた:
{
"colors": [
"red",
"green",
"blue",
]
}
修正済み:
{
"colors": [
"red",
"green",
"blue"
]
}
パターンは同じです:"blue"の後のカンマが、パーサーに別の要素を期待させます。代わりに]が見つかり、エラーが報告されます。JSON配列からアイテムを削除する際は、常に新しい最後のアイテムに末尾のカンマがないか確認してください。
エラー9:スマートクオート(カールクオート)
これは厄介です。Word文書、Slackメッセージ、またはブログ投稿からJSONをコピーすると、システムが直線的なクオート(")をタイポグラフィックな「スマート」クオート(\u201Cおよび\u201D)に静かに置き換えることがあります。見た目はほぼ同じですが、全く異なる文字です。
壊れた:
{
\u201Cname\u201D: \u201CAlice\u201D,
\u201Ccity\u201D: \u201CPortland\u201D
}
修正済み:
{
"name": "Alice",
"city": "Portland"
}
エラーメッセージは通常、位置1または2でUnexpected tokenとなりますが、引用符が間違っていることに気づくまで混乱します。修正方法:すべてのカールクオートを直線的なダブルクオートに置き換えます。急いでいる場合は、プレーンテキストエディタで手動で引用符を再入力してください。
これを防ぐために、JSONを書く際は常にコードエディタを使用してください(リッチテキストエディタではなく)。アプリケーション間で頻繁に貼り付ける場合は、OSのキーボード設定で「スマートクオート」を無効にしてください。
エラー10:BOM(バイトオーダーマーク)文字
BOMは、ファイルの先頭に挿入される目に見えない文字(U+FEFF)であり、一部のWindowsテキストエディタがエンコーディングを示すために使用します。JSONパーサーは、開き波括弧の前に予期しない文字としてこれを認識し、すぐに失敗します。
症状:
SyntaxError: Unexpected token \uFEFF in JSON at position 0
ほとんどのエディタではBOMは見えません — 本当に目に見えないのです。これを検出するには、ファイルを16進エディタで開き、最初のバイトEF BB BF(UTF-8 BOM)を探します。
修正方法:
- VS Codeでは、ステータスバーのエンコーディングインジケーターをクリックし、「エンコーディングで保存」→「UTF-8(BOMなし)」を選択します。
- コマンドラインで:
sed -i '1s/^\xEF\xBB\xBF//' file.json - Node.jsでは、パースする前にそれを削除します:
const clean = text.replace(/^\\uFEFF/, "");
すべての10のエラーのクイックリファレンス
| # | エラー | 原因 | 修正 |
|---|---|---|---|
| 1 | 末尾のカンマ | 最後のプロパティ/要素の後のカンマ | 末尾のカンマを削除 |
| 2 | シングルクオート | "の代わりに'を使用 | ダブルクオートに置き換え |
| 3 | 引用されていないキー | ダブルクオートなしのキー | すべてのキーをダブルクオートで囲む |
| 4 | コメント | JSON内の//または/* */ | すべてのコメントを削除 |
| 5 | カンマが欠落 | アイテム間にカンマなし | アイテム間にカンマを追加 |
| 6 | 括弧/波括弧が欠落 | [または{が閉じられていない | 欠落した閉じ文字を追加 |
| 7 | undefined / NaN / Infinity | JSON内のJS専用の値 | nullまたは文字列に置き換える |
| 8 | 配列内の余分なカンマ | 配列内の末尾のカンマ | 末尾のカンマを削除 |
| 9 | スマートクオート | Word/Slackからのカールクオート | 直線的なダブルクオートに置き換え |
| 10 | BOM文字 | ファイルの先頭に見えないU+FEFF | BOMなしでUTF-8として再保存 |
JSONエラーを防ぐ
エラーを修正することは良いことですが、最初からエラーを作らないことはもっと良いことです。JSONをクリーンに保つための習慣は以下の通りです:
- JSONを手動で書かない。
JSON.stringifyや言語の同等物を使用して生成します。シリアライザーは定義上、有効なJSONを生成します。 - JSON対応のエディタを使用する。 VS Code、JetBrains IDE、Sublime Textなどは、リアルタイムでJSONの構文エラーをハイライトします。赤い波線が表示されたら、保存する前に修正してください。
- CIでバリデートする。 ビルドパイプラインにすべてのJSONファイルをパースし、エラーで失敗するバリデーションステップを追加します。シェルスクリプトの1行で実行できます:
find . -name "*.json" -exec python -m json.tool {} \\; - 設定にはJSONCを使用する。 コメントが必要な場合は、サポートされている場合はJSONC(
.jsonc拡張子)を使用してください。TypeScript、VS Code、その他多くのツールがネイティブに処理します。
自動修復を使用するタイミング
受け取るJSONがあなたの制御外である場合があります — 不完全に構築されたサービスからのAPIレスポンス、レガシーソフトウェアによってエクスポートされたファイル、または非技術的なチームメンバーによって貼り付けられたチャンクなどです。このような場合、手動で修復するのは面倒でエラーが発生しやすいです。
自動修復ツールは、上記のリストにあるほとんどのエラーを1回のパスで修正できます。壊れた入力をパースし、意図された構造を推測し、有効なJSONを生成します。これは、末尾のカンマ、シングルクオート、引用されていないキーなどの一般的な問題に対してうまく機能します。
トレードオフは、自動修復が仮定を行うことです。JSONがひどく不正な形式である場合 — 大きなセクションが欠落しているか、構造的にあいまいである場合 — ツールが間違った推測をする可能性があります。生産環境で使用する前に、修復された出力を常に検証してください。
自分で試してみてください: 壊れたJSONを私たちのJSON修復ツールに貼り付けて一般的なエラーを自動修正するか、JSONバリデーターを使用して問題の正確な場所を特定してください。