FormatArc の JSON Formatter で JSONC のコメントを除去後の JSON をパースした画面FormatArc の JSON Formatter で JSONC のコメントを除去後の JSON をパースした画面
著者: FormatArc 編集部公開日: 2026-04-13更新日: 2026-08-09

JSON コメントアウトの書き方: 使えない理由と代替 4 方法

JSON にコメントは書けますか? — 先に結論

書けません。標準の JSON(RFC 8259)はドキュメント内のどの位置にもコメントを許可していません。.json ファイルの中に ///* ... */ を書くと、厳密なパーサーは「Unexpected token」エラーで失敗します。これは仕様の構造上の制約で、Section 2 の文法がコメントを定義していないためです。一方 Section 9 は「パーサーは非 JSON 形式や拡張を受け入れてもよい(MAY accept non-JSON forms or extensions)」と認めており、これが JSONC や JSON5 が仕様違反にならない根拠になっています。

どうしても JSON にコメントを書きたい、設定値をコメントアウトして残したい、あるいは説明用のコメント行を入れたいという場合は、次の 4 つの実用的な選択肢があります。

  • JSONC — VS Code が採用している「コメント付き JSON」
  • JSON5 — コメント・末尾カンマ・ゆるい文法を含む、仕様化された JSON のスーパーセット
  • 標準 JSON の中に "_comment": "..." のようなダミーフィールドを置く
  • パース前にコメントを除去する

この記事では、それぞれの選択肢の使いどころ、選び方、そしてコメント付きの JSON を標準 JSON に変換するための具体的な手順を解説します。

先に結論だけ押さえたい場合は、用途ごとに次のように選びます。

  • VS Code や Microsoft 系の設定ファイルを書いている場合は JSONC を使います
  • 新規プロジェクトの設定フォーマットを選ぶ場合は JSON5 を使います
  • パーサーが厳格で差し替えできない場合は _comment フィールドコメント除去 で対応します

コメント付きの JSON は、除去してから貼り直す必要はありません。そのまま FormatArc の JSON Formatter に貼るとパースエラーの横に「自動修復」ボタンが出ます。押すと適用される規則が一覧で表示され、「適用」で ///* */ が取り除かれた JSON に置き換わります。ブラウザで完結し、データは手元から出ません。読みやすい JSON に整える具体的なコツは JSON 整形のコツと注意点 を参照してください。

JSON がコメントを許可しない理由

JSON の設計者である Douglas Crockford は、意図的にコメントを仕様から外したと語っています。コメントにパース用のディレクティブが埋め込まれ、相互運用性が壊れる事例が実際にあったためです。結果として JSON は次のようにシンプルな形になりました。

  • 小さい — 文法が 1 ページに収まる
  • 曖昧さがない — 値の解釈は常に 1 通り
  • ポータブル — どの言語の組み込みパーサーも同じ挙動

代わりに、「なぜこの設定値なのか」を JSON ファイル自体に書き残すことはできません。これがトレードオフであり、多くのツールが JSONC や JSON5 のようなスーパーセットを使う理由でもあります。

JSON そのものの文法が知りたい場合は JSON の書き方ガイド を参照してください。

選択肢 1: JSONC — JSON with Comments

JSONC は Microsoft が VS Code で採用している非公式の拡張で、JSON に次の 2 つを追加したものです。

  • // 行末までのコメント
  • /* 複数行にまたがるコメント */

それ以外は通常の JSON と同じです。典型的な JSONC ファイルは次のような見た目です。

{
  // VS Code 起動時に使用するテーマ
  "workbench.colorTheme": "Default Dark Modern",

  /* エディター全体の設定
     すべての言語に適用される */
  "editor.tabSize": 2,
  "editor.formatOnSave": true
}

VS Code の settings.jsontsconfig.jsonlaunch.json、そして Microsoft 系のツールはほとんどが JSONC を前提にしています。Deno の設定ファイル(deno.json)などでも採用されています。

JSONC のパース方法

JSONC は組み込みの JSON.parse では読めないので、専用ライブラリが必要です。

Node.js:

// npm install jsonc-parser
import { parse } from "jsonc-parser";
const data = parse(sourceText);

Python:

# pip install jstyleson
import jstyleson
data = jstyleson.loads(source_text)

VS Code 本体は自前の JSONC パーサーを持っているため、settings.json にコメントを書いても壊れません。

行コメント(//)だけ使いたい場合 — コメント行の最小構成

実務でコメント行として使うのは、ほぼ行コメント // だけです。ブロックコメント /* */ まで必要なケースは少なく、「設定の意図を 1 行メモしたい」だけなら次の最小構成で足ります。

VS Code なら、ファイル全体を JSONC に移行しなくても、該当ファイルだけ言語モードを「JSON with Comments」に切り替えれば // のコメント行が赤線エラーになりません。ステータスバー右下の言語表示(「JSON」)をクリックして「JSON with Comments」を選ぶだけです。

ただし言語モードの変更はエディタ上のエラー表示を消すだけです。そのファイルを読み込むプログラム側のパーサーが JSONC 対応でなければ、実行時の「Unexpected token」エラーは残ります。コメント行を書いた .jsonJSON.parsejson.loads に渡す場合は、前述の JSONC 対応ライブラリを通すか、後述のコメント除去パターンで標準 JSON に変換してから渡してください。

選択肢 2: JSON5 — 仕様化された拡張版

JSON5(json5.org別タブで開きます)は正式な仕様を持つ JSON のスーパーセットで、ECMAScript 5 から借りたいくつかの便利な機能を追加しています。

  • 行コメントと複数行コメント
  • オブジェクトと配列の末尾カンマ
  • 識別子として有効なキーのクォート省略
  • シングルクォートの文字列
  • 行継続によるマルチライン文字列
  • 16 進数、先頭・末尾の小数点、InfinityNaN

JSON5 のファイルはかなりゆるい見た目になります。

{
  // ステージング環境のフィーチャーフラグ
  features: {
    newDashboard: true,
    legacyNotifications: false,
    rateLimitRps: 0xff,
  },
  welcomeMessage: 'Hello, world',
  /* 末尾カンマも OK */
}

JSON5 は仕様が文書化されているため、ほとんどの言語にライブラリがあります。Node.js の json5別タブで開きます、Python の pyjson5、Ruby の json5 などが一般的です。

JSONC と JSON5、どちらを使うべきか

似ているようで、それぞれ特性が異なります。

JSONCJSON5
公式仕様なしあり(spec.json5.org別タブで開きます
コメント対応対応
末尾カンマ一部対応対応
キーのクォート省略非対応対応
シングルクォート文字列非対応対応
エコシステムMicrosoft / VS Codenpm 等、独立

選び方の目安は次のとおりです。

  • Microsoft / VS Code の設定ファイルを編集している場合は、すでに JSONC なのでそのまま
  • 新規プロジェクトで設定フォーマットを選ぶなら、仕様書をツールに指し示せる JSON5 が扱いやすい
  • 標準 JSON パーサーとの相互運用が最優先なら、純粋な JSON のまま後述の回避策パターンを使う

実装ごとの対応状況: それぞれが実際に許可する機能

次の表は、よくある 5 つの「非 JSON」機能を、厳密な標準と 2 つのスーパーセットで比較したものです。RFC 8259 の列は RFC 8259別タブで開きます Section 2 の文法(ECMA-404別タブで開きます に成文化された文法と同じもの)を反映しています。JSON5 の列は公開された JSON5 仕様別タブで開きます を、JSONC の列は VS Code 向けに文書化された Microsoft の非公式拡張を反映しています。

機能RFC 8259 で許可される?JSONCJSON5
行コメント //不可対応対応
ブロックコメント /* */不可対応対応
末尾カンマ不可任意対応
キーのクォート省略不可非対応対応
シングルクォート文字列不可非対応対応

RFC 8259 の列がすべて「不可」なのは、Section 2 の文法にこれらの機能を受け付ける production rule が存在しないためです。文字列はダブルクォートで囲む必要があり、キーは文字列で、オブジェクトや配列の最後の値の後ろに要素を置くこともできません。JSON5 は仕様が ECMAScript 5 の構文を明示的に追加しているため、5 つすべてに対応します。JSONC は 2 種類のコメントを常に追加しつつ、厳密な JSON のダブルクォートのキーと文字列を維持します。末尾カンマの対応はパーサー依存(JSONC の仕様はパーサーが受け付けてもよい(MAY)としており、リファレンス実装の jsonc-parserallowTrailingComma をデフォルトで無効にしています)であり、セルが「対応」ではなく「任意」になっているのはそのためです。

標準 JSON を守ったままコメントを残す回避策

サードパーティのサービスが標準 JSON しか受け付けないといった状況では、パーサーを変えずに文字列フィールドとしてメモを残す方法が使えます。

パターン 1: _comment フィールド

{
  "_comment": "上流のタイムアウトに引っかかる前にリトライを増やす",
  "retries": 3,
  "timeout_ms": 5000
}

アンダースコアで始まるキーは慣習的に消費側で無視されることが多く、多くのコードでは通常のデータとして扱えます。もっとも単純な回避策です。

パターン 2: フィールドごとに隣接するコメント用キー

{
  "retries": 3,
  "retries_comment": "これ以上は上流のタイムアウトを超えてしまう",
  "timeout_ms": 5000,
  "timeout_ms_comment": "ロードバランサーのタイムアウトに合わせている"
}

冗長になりますが、どのコメントがどのフィールドに対応するかが明確になります。

パターン 3: メタデータ用の外側ブロック

{
  "$meta": {
    "generated_by": "deploy.sh",
    "purpose": "ステージング環境用のサービス設定"
  },
  "service": {
    "port": 8080,
    "retries": 3
  }
}

トップレベルにメタデータ用のオブジェクトを置くと、本体のペイロードを汚さずにコンテキストを残せます。

これらはすべて実データとしてファイルに書き込むため、厳密なパーサーも受け付けます。デメリットは、追加フィールドがスキーマの一部になるので、消費側にも存在を説明する必要がある点です。

package.json にコメントを書く

package.json は npm が読み込む標準 JSON ファイルなので、///* */ のコメントアウトはできません。書くと npm installJSON.parse の段階で失敗します。ただし npm は知らないトップレベルのキーを無視するため、回避策パターンをそのまま応用できます。

よく使われるのは、"//" という慣習的なキーにメモを入れる方法です。

{
  "//": "private レジストリを使う設定。社内 CI でのみ有効",
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "build": "tsc -p ."
  }
}

同じキーは 1 オブジェクト内で 1 回しか使えないため、複数の説明を残したいときは配列を使います。

{
  "__comments": [
    "deploy 用のスクリプトはこのファイルでは管理しない",
    "engines は CI の Node バージョンと揃えること"
  ],
  "name": "my-app",
  "engines": { "node": ">=20" }
}

npm 自体はこれらのキーを無視しますが、npm publish で公開するパッケージにはメモも同梱されます。社内ツールやプライベートリポジトリで使う package.json に向いた方法です。設定の意図をしっかり残したい場合は、後述のコメント除去パターンで JSONC として書いてから公開用に変換するほうが安全です。

コメントを除去してから標準パーサーに渡す

JSONC や JSON5 のファイルを標準 JSON パーサーに渡したい場合、選択肢は 2 つです。JSONC / JSON5 ライブラリでパースしてから JSON として書き出し直すか、正規表現でコメントを除去するかです。

Node.js で json5 パッケージを使う例です。

// npm install json5
import JSON5 from "json5";
import fs from "node:fs";

const source = fs.readFileSync("config.json5", "utf8");
const data = JSON5.parse(source);
fs.writeFileSync("config.json", JSON.stringify(data, null, 2));

最小限の正規表現による除去もできます。ただし文字列リテラルに // を含む場合は壊れるので、自分で管理しているファイル以外にはおすすめしません。

const stripped = source
  .replace(/\/\/[^\n\r]*/g, "")
  .replace(/\/\*[\s\S]*?\*\//g, "");
const data = JSON.parse(stripped);

安全策としては常に専用パーサーを通すほうが無難です。

Python で JSONC / JSON5 を扱う

Python の標準ライブラリ json は厳密な JSON しか読めないため、JSONC や JSON5 をそのまま json.loads に渡すとコメント行で失敗します。対処は 2 通りあります。

軽量に済ませたい場合は、標準ライブラリの re でコメントを除去してから json.loads に渡します。

import json, re

def load_jsonc(text):
    text = re.sub(r"//[^\n]*", "", text)        # 行コメント
    text = re.sub(r"/\*.*?\*/", "", text, flags=re.S)  # ブロックコメント
    return json.loads(text)

with open("tsconfig.json", encoding="utf-8") as f:
    config = load_jsonc(f.read())

この正規表現は文字列リテラルの中に // を含むデータでは誤って削ってしまうため、自分で管理しているファイル以外には使わないでください。

末尾カンマやクォート省略まで含めて正しく読みたい場合は、専用ライブラリを使います。JSONC なら jstyleson、JSON5 なら json5 または pyjson5 が定番です。

# pip install jstyleson json5
import jstyleson
import json5

config = jstyleson.load(open("settings.json", encoding="utf-8"))   # JSONC
data = json5.load(open("config.json5", encoding="utf-8"))          # JSON5

設定を読むだけなら正規表現でも足りますが、入力が信頼できない、あるいは末尾カンマやシングルクォートが混ざる可能性があるなら、専用ライブラリのほうが安全です。

FormatArc で整形して結果を確認する

標準 JSON になったら、FormatArc の JSON Formatter に貼り付けて整形表示を確認できます。もしパーサーが依然としてエラー(典型的には Unexpected token /)を出すなら、まだコメントが残っている可能性が高いです。原因の一覧は JSON Parse Error の解決方法 にまとまっています。

FormatArc JSON Formatter で整形済み JSON を表示している画面FormatArc JSON Formatter で整形済み JSON を表示している画面

FormatArc 自体はブラウザ組み込みの JSON.parse を使っていますが、パースに失敗したときは自動修復を挟めます。手順は次のとおりです。

  1. コメント付きのまま JSON Formatter に貼り付ける
  2. エラー表示の横に出る「自動修復」を押す
  3. 適用される規則の一覧を確認して「適用」を押す
  4. 整形された JSON を読み・検証・コピーする

自動修復が扱うのは // の行コメント、/* */ のブロックコメント、末尾カンマ、連続カンマの 4 つです。文字列の中にある //"https://example.com" など)は対象外なので、URL が壊れることはありません。JSON5 の単一引用符やクォートなしキーには対応していないので、その場合は JSON5 ライブラリでパースしてから貼り付けてください。すべてブラウザで完結し、データは手元から出ません。

よくある質問

RFC 8259 は JSON コメントについて何と書いていますか?

RFC 8259 は「コメント」という単語自体を一度も使っていません。Section 2 の JSON 文法(ABNF)で「トークンの間に置ける空白は space / tab / line feed / carriage return の 4 種のみ」と定義されており(ws = *( %x20 / %x09 / %x0A / %x0D ))、///* */ を受け付ける production rule が存在しないため、厳密なパーサーは「Unexpected token」エラーで拒否します。一方 Section 9 では「JSON パーサーは非 JSON 形式や拡張を受け入れてもよい(MAY)」と明記されており、これが JSONC や JSON5 が仕様違反にならない根拠です。

.json ファイルに ///* のコメントを書けますか?

厳密なパーサー(JSON.parsejson.loadsencoding/json)で読む場合は書けません。最初のコメントで「Unexpected token」エラーになります。拡張子を .jsonc に変えて JSONC 対応のローダーを使うか、JSON5 に移行してください。

.json ファイルの 1 行だけコメントアウトできますか?

できません。JSON には行コメントの構文自体が存在しないため、値を一時的に無効化する目的で行頭に // を付けると、その行が構文エラーになります。1 行だけ無効化したい場合の書き方は 3 つです。キーごと削除してバージョン管理の履歴に残す、無効化したいキーを _disabled_ などの接頭辞付きキーにリネームして退避する、ファイルを JSONC 対応の環境に切り替えて正式にコメントアウトする、のいずれかを選んでください。

なぜ VS Code は settings.json にコメントを書いても壊れないのですか?

VS Code は settings.json のようなファイルを厳密な JSON ではなく JSONC として扱っているためです。組み込みのパーサーが ///* */ を受け付けます。同じファイルを JSON.parse で読む他のエディタは、JSONC を理解していなければ失敗します。

JSON5 は標準仕様ですか?

JSON5 は spec.json5.org別タブで開きます に公開された仕様を持ちますが、IETF や ECMA の標準ではありません。開発ツール界隈では広くサポートされていますが、API や通信プロトコルで使われる RFC 8259 JSON の代替にはなりません。

_comment フィールドと JSON5、どちらを使うべきですか?

ファイルを多数のツールが読み、その中に厳密な JSON しか扱えないものがあるなら、標準 JSON のまま _comment パターンを使ってください。ファイルを自分の管理下にあるコードだけが読むなら、JSON5 のほうが本物のコメントを書けてノイズも少なくなります。

FormatArc は JSONC や JSON5 に対応していますか?

JSONC は自動修復で扱えます。コメント付きのまま FormatArc の JSON Formatter に貼り、エラー表示の横に出る「自動修復」から「適用」まで進むと、///* */ が取り除かれた JSON になります。末尾カンマと連続カンマも同時に直ります。JSON5 の単一引用符やクォートなしキーは自動修復の対象外なので、その場合は JSON5 ライブラリでパースしてから貼り付けてください。

YAML ではどうなのですか?

YAML は # で標準的にコメントをサポートしています。主な目的がコメントで、フォーマットを変えられるなら、YAML のほうが設定ファイルには向いていることも多いです。詳細は YAML と JSON の違い を参照するか、YAML の書き方ガイド に直接進んでください。

関連記事

JSON そのものをもっと理解したい場合:

JSONC や JSON5 を選んで、その出力を扱う場合:

コメントが必要でフォーマットを変えられる場合:

まとめ

  • 標準 JSON はコメントをサポートしていません。仕様上の意図的な制約です
  • JSONC は ///* */ を許可し、VS Code で広く使われています
  • JSON5 は仕様化されたスーパーセットで、コメント・末尾カンマ・ゆるい構文を持ちます
  • パーサーを変えられない場合は _comment フィールドや外側メタデータブロックで対応できます
  • コメント付きの JSON は FormatArc の JSON Formatter にそのまま貼り、自動修復でコメントと末尾カンマを取り除いてから整形・検証できます