JSON の文法には、コメントを書く仕組みがありません。このページでは、仕様の文法を読み、実際に JSON.parse へコメント付きの文字列を渡して、何が起きるかを確かめます。

仕様は空白を 4 文字しか認めていない

json.org は、JSON の文法を図で示したうえで、次のように述べています。

Whitespace can be inserted between any pair of tokens. Excepting a few encoding details, that completely describes the language.

出典: https://www.json.org/json-en.html(取得日: 2026-09-22)

「トークンの間には空白を入れてよい。文字エンコーディングの細部を除けば、これで言語の全体が説明できる」という意味です。文法の図にも、コメントの項目はありません。

標準化された文書である RFC 8259 も同じです。空白(ws)は次の 4 文字だけを認めています。

ws = *(
        %x20 /              ; Space
        %x09 /              ; Horizontal tab
        %x0A /              ; Line feed or New line
        %x0D )              ; Carriage return

出典: https://www.rfc-editor.org/rfc/rfc8259(取得日: 2026-09-22)

スペース・タブ・改行・復帰です。// や /* */ をトークンの間に置ける、という規定はどこにもありません。つまり、コメントは「空白として無視される書き方」にも入っていません。

JSON.parse に渡してみる

Node.js の JSON.parse は、この文法に沿って読みます。行コメント・ブロックコメント・末尾カンマを 1 つずつ渡します。

for (const [n, s] of [
  ["line", '{"a":1 // c\n}'],
  ["block", '{"a":1 /* c */}'],
  ["trailing", '{"a":1,}'],
]) {
  try {
    JSON.parse(s);
    console.log(n, "ok");
  } catch (e) {
    console.log(n + ":", e.message);
  }
}

3 つとも構文エラーです。position 7 は 0 から数えた文字の位置で、{"a":1 の直後にある /(末尾カンマの例では })を指しています。エラーメッセージは、1 の後ろに来てよいのは , か } だけだと言っています。

「空白ではない」ことの意味

JSON の文法では、トークンの間に置けるものが空白の 4 文字に限られています。そのため、パーサーは「ここは読み飛ばしてよい部分」を、この 4 文字だけで判断できます。// から行末までを飛ばす、/* から */ までを飛ばす、といった処理は、文法に書かれていないので、標準の実装は持ちません。

だから、JSON にコメントを書いて JSON.parse に渡すと、コメントは「読み飛ばされる部分」ではなく「文法に合わない文字」として扱われます。エラーメッセージの位置が、コメントの始まりの / を指していたのは、このためです。

このページで言えること

  • JSON の文法(json.org・RFC 8259)に、コメントの仕組みは無い
  • 空白として許されるのは 4 文字だけで、// や /* */ は空白ではない
  • 標準どおりに読む JSON.parse は、コメントを構文エラーにする

ここで確かめたのは「標準の JSON」の話です。次のページでは、拡張子が同じ .json でも、コメントを受け付けるファイルがあることを見ます。