いつも気をつけているのだが、割とうっかりやらかすので戒めのためにメモ。
JSONは元々JavaScriptの記法を元にしたフォーマットだが、実はJavaScript上では許されているがJSONとしては許されていないものがある。
その代表例の一つが末尾のカンマだ。
例えば次はJavaScriptのオブジェクトの例だ。
例: sample1.js
let data = {"key": "value",};
ここで"value"の後ろに , が付いているのがお分かりいただけるだろうか。
これはJavaScriptの記法上OKとなる。
ただし以下の場合は例外が発生する。
例: sample2.js
let data = JSON.parse('{"key": "value",}');
これを実行するとJSON解析の例外としてUncaught SyntaxErrorが発生するのではないだろうか。
これはJSONの書式としては許可されておらず、きちんと , の後ろに要素が必要であることを意味している。
ちなみにこれはJSONの配列(Array)の場合も同様で、すなわちJavaScriptの場合は問題ないがJSONの場合はUncaught SyntaxErrorとなる
(もちろん例外の詳細については異なるが)
ちなみになぜ末尾のカンマをついつい付けてしまうのかについて。
これは割と僕の経験則によるものだが……パッと思いつくだけで以下の3つがある。
- GITなどの差分管理上
- なるべく関係のない行に変更を加えたくないから
- 衝突解決の際のマージの過程で紛れ込んだから
- JSONを出力するfor文(主にテンプレートエンジン)で、分岐処理を書きたくないから(あるいは書き忘れたから)
特に多いのは 1.2. かなと思う。
最後の , の付いていない行を削除するコミットとその直前に行を追加するコミットがぶつかった場合に、気づかずに末尾に , が付与される状態が完成してしまうパターンだ。
しかもこの場合は衝突したどちらのコミットの行も正しくないという状態なので、きちんと自分で編集を加えなければならないことになる
(つまりは正しい行の採択だけで解決できない)
ちなみに , だけを別の行にする手もあるが、結局 , の有無をチェックしなければならないことには変わりない。
また衝突の際に行としての差分が出なくなる可能性もあるので、それはそれで逆に厄介な可能性もあるか。