JSONのよくある構文エラーと直し方
JSONはAPIの応答や設定ファイルで広く使われるデータ形式ですが、JavaScriptの記法と似ているために混同しやすい構文エラーがあります。本記事はJSONの仕様(RFC 8259)に基づき、よくあるエラーの原因と直し方を具体例で示します。JSONは「JavaScript Object Notation」の略で、JavaScriptのオブジェクトリテラルから生まれた形式ですが、現在はJavaScript自体から独立した仕様としてRFC 8259で定義されています。JavaScriptで書けるものがそのままJSONとして通るとは限らない点が、エラーの原因になりやすいところです。
末尾カンマ
配列やオブジェクトの最後の要素の後にカンマを付けると、JSONの仕様違反になります。{"name":"ayame","list":[1,2,3,]}は、3の後のカンマが不要で、構文エラーになります。正しくは{"name":"ayame","list":[1,2,3]}のように、最後の要素の後にカンマを置きません。
シングルクォートと引用符なしのキー
JSONの文字列とキーは、二重引用符(")でだけ囲むことができます。{'name':'ayame'}のようにシングルクォート(')を使ったり、{name:"ayame"}のようにキーを引用符で囲まずに書いたりすると構文エラーになります。正しくは{"name":"ayame"}のように、キーと文字列の両方を二重引用符で囲みます。JavaScriptのオブジェクトリテラルではシングルクォートや引用符なしのキーが使えるため、JSONと混同しやすい点です。
コメントの混入
JSONの仕様にはコメントの構文が定義されていないため、// 説明のような行コメントや/* 説明 */のようなブロックコメントを含めると構文エラーになります。設定ファイルでコメントを残したい場合は、コメント専用のキー(例: "_comment")を値として持たせるか、JSONとは別の形式を使う必要があります。
数値の書き方の落とし穴
JSONの数値の構文では、整数部分の先頭に余分な0を付けることはできません。{"code":07}や{"code":007}のように0から始めると構文エラーになります。正しくは{"code":7}、または文字列として扱うなら{"code":"007"}のように引用符で囲みます。小数点の前が0だけの0.5のような書き方は問題ありません。また、JavaScriptではNaNやundefined、Infinityを値として扱えますが、JSONの値の構文にはこれらが含まれていないため、そのまま書くと構文エラーになります。計算結果が不定になる場合はnullを使うなどの対応が必要です。
参考資料
ここで紹介したエラーは、ブラウザ標準のJSON.parseなどのパーサーに通すと、エラーメッセージとして該当箇所が示されることが多く、見た目では分かりにくい構文の誤りも見つけやすくなります。この記事の構文チェックはJSON整形ツールでも確認できます。