2026/03/23

JSONCに足りないもの

JSON

JSON のデータは以下のようなものだ。

{
    "foo": 123,
    "bar": [
        "str1",
        "str2"
    ],
    "baz": {
        "hoge": 4567
    }
}

JSONデータ自体は様々な場面で利用される。 とりわけ、人力で読み書きするには YAML の方に利がありそうではあるが、インデントに依存した記述が嫌われているのか、近年では設定ファイルのようなものにも JSON が使われている場面をよく目にする(個人の意見です)。

JSON のここがちょっと、、、

JSONは、非常にシンプルで軽量でライブラリもそろっていて便利な反面人力編集には難がある。

要素の末尾のカンマが許容されない

以下の JSON は文法エラーになる。

{
    "foo": 123,
    "bar": 456,
}

bar456 の後ろのカンマが JSON では許容されない。いわゆるケツカンマが許容されない。

JSONパーサによっては、ケツカンマを許容してパースする機能があったりする。

コメントが書けない

データも大きくなったらコメントが欲しくなるが、JSONにはコメント記法が無い。

コメントが必要ないくらい宣言的に、理解しやすい命名が強制されるという意味ではコメントが無いのが良い方向性かもしれないが、冗長に説明を書きたい場面があっても JSON だとコメントは書けない。

JSONC

ケツカンマと、コメントが書ける JSON の Alternative として、JSONC というものがある。やったね。

{
    // JSONCなら末尾カンマも問題ないし、コメントも書ける
    "foo": 123,
    /*
        複数行の
        コメントも
        書けるよ
    */
    "bar": 456,
}

JSON と JSONC の問題

JSONパーサライブラリは JSONC のパースにも対応していることが多い。しかし、.json という拡張子で JSONC が存在するので厄介な場面がある。

例えばエディタは、.json ファイルでありながら JSONC であることを知るには、コメントやケツカンマの存在から自動的に判定することになる。 コメントが書かれた場合は恐らく書いている人も JSONC を意図しているであろうが、ケツカンマは怪しい。ファイルは JSON でなければならないのにエディタが JSONC であると判断してシンタックスエラーをださなければ、そのファイルが利用される場面で文法エラーになって問題になりうる。

JSONCには宣言が必要

JSONC が .json で記述されるのなら、そのファイルが JSON ではなく JSONC であるというなんらかの宣言が必要であろう。

例えば冒頭にコメントを書く、などだ。以下のように、ファイル冒頭にコメントで JSONC であることを宣言する。

//jsonc
{
    "foo": 123,
}

こうして明示されることになればエディタは .json ファイルであっても JSONC であることを確実に認識しながら処理ができる。

とはいえ、そもそも JSONC というファイル形式は正式な仕様がなく、実装依存だったりする。だから、ケツカンマは許容されるけどコメントは許容されない、またはコメントも許容されるけど複数行のコメントは許容されないみたいな方言がある。大富豪か。

だから、冒頭の宣言はアトリビュートも書くようにするといい。以下のように書けばインラインコメントと末尾カンマが許容されるものとしよう。

//jsonc:trailing-comma
{
    "foo": 123,
}

まあたぶん、アトリビュートなしなら全部許容でよいのではないか。知らんけど。

というわけで、JSONC にはあとひとつ、ファイル形式を示す何かが足りない。だから冒頭にコメント書こうぜ、という話でした。

まあ、これはすでに多く語られている話であるので、別に私のアイデアというわけではない。

サイト内検索