データ · 5分で読めます ·

JSONが無効?ほとんどのエラーの原因になる7つのミス

末尾のカンマ、シングルクォート、コメントなど、JSONを壊す小さなミスと、その素早い見つけ方・直し方をまとめました。

「Unexpected token」や「Unexpected end of JSON input」は、開発者が最もよく目にするエラーの一つです。JSONは元になったJavaScriptよりずっと厳格な形式で、失敗のほとんどはいくつかの典型的なミスに行き着きます。

1. 末尾のカンマ

オブジェクトや配列の最後の要素の後ろにあるカンマは、エラーの第1位です。JavaScriptでは許されますが、JSONの規格では許されません。

{"name": "Ana", "age": 31,}   ✗
{"name": "Ana", "age": 31}    ✓

2. シングルクォートと 3. 引用符のないキー

キーと文字列はすべてダブルクォートで囲む必要があります。{name: 'Ana'} はJavaScriptとしては正しくても、JSONとしては無効です。{"name": "Ana"} と書きます。

4. コメント

JSONにはコメントがありません。// や /* */ はエラーになります。VS Codeの設定のようにJSON5やJSONCで書かれた設定ファイルからコピーすると、ここでつまずきがちです。

5. 特殊な値と 6. エスケープしていない文字

undefined、NaN、Infinity、関数はJSONには存在しません。null か数値を使いましょう。文字列の中では、ダブルクォートは \"、バックスラッシュは \\、改行は \n と書きます。Windowsのパスは典型的な落とし穴で、"C:\new" はバックスラッシュとnではなく改行を含んでいます。

7. 括弧の不足や余分

閉じ括弧の } や ] が足りないと、たいてい本当の原因から離れた入力の最後でエラーになります。インデントを付けて整形すると、どの階層が壊れているかがすぐに分かります。

見えにくいエラー

画面上では完璧に見えるのに、無効なJSONもあります。

  • カーリークォート。ワープロ、チャットアプリ、スライドからコピーした文章には、まっすぐな二重引用符の代わりに“と”が入っていることがよくあります。見た目はほぼ同じですが、JSONが受け付けるのはまっすぐな"だけです。
  • バイトオーダーマーク(BOM)。Windowsの一部のエディタは、ファイルの先頭に見えない文字を付けて保存します。JavaScriptのJSON.parseもPythonのjson.loadsもこれを拒否し、エラーは位置0を指します。
  • Webページから貼り付けたノーブレークスペースなどの見えない文字。

有効なのにバグの原因になるJSON

Pythonのjson.dumpsは既定でNaNやInfinityを書き出しますが、ほかのパーサーはこれを受け付けません。allow_nan=Falseを指定すれば早めに気づけます。データベースの64ビットIDのような非常に大きな整数は有効なJSONですが、JavaScriptでは9007199254740991を超えると精度が失われるため、多くのAPIは文字列として送ります。重複したキーは多くのパーサーで許されますが、黙って最後の値が採用されます。

エラーメッセージの読み方

パーサーが報告するのは、あきらめた場所であって、間違えた場所ではありません。カンマの抜けは通常次のキーの先頭で、閉じ括弧の抜けは入力の最後で報告されます。報告された位置のすぐ手前を確認しましょう。

{
  "name": "Ana"
  "age": 31        ← ここでエラーが報告される(3行目)
}                   抜けているカンマは2行目の末尾

正確な場所を見つける

4DevのJSONバリデーターは、テキストをJSONの規格(RFC 8259)に照らしてチェックし、最初のエラーの行と列を修正案とともに表示します。チェックするのは構文で、意味ではありません。有効なJSONでも、アプリにとっては型が違ったり項目が足りなかったりすることがあります。

JSONバリデーターを開く

LinkedInXFacebook