何かの設定ファイルとかでJSON使ってて、ファイル内にコメントを書きたくなったり、一時的に設定変更するのに、前の値をコメントアウトして残して置きたかったりとかありますよね
(きっと私だけではないはず)
JSONファイル内には、基本的にコメントが書けなくて困ってたんですが、いろいろ調べた結果、使えそうな方法を4つ見つけたので、メモしておきます。
JSON
JavaScript Object Notation(JSON)は、これを可能にするデータ交換形式です。 JSONは、人間が読めるテキストであり、軽量で、コーディングが少なくて済み、処理が高速であるため、データ形式として多くの開発者に選ばれています。
https://www.oracle.com/jp/database/what-is-json/#:~:text=JavaScript%20Object%20Notation%EF%BC%88JSON%EF%BC%89%E3%81%AF,%E3%81%AB%E9%81%B8%E3%81%B0%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
1. コメントをデータとして保持する
単純にJSONのルールに乗っ取ったデータの一つとして、コメントを保持するようにします。
こんな感じ。
{
"_comment": "コメントをデータとして保持する",
"id": "hogehoge_id",
"name": "ほげほげ"
}
データとして、使用しないことが分かりやすいように、キー名を_(アンダースコア)
始まりにするとか、それぞれルールを決めておくと良いかと思います。
以下のように、キー名を空にしちゃうってのも一つの手です。
{
"": "コメントをデータとして保持する",
"id": "hogehoge_id",
"name": "ほげほげ"
}
2. 2行以上のコメントも書きたい
はい、そういう時もありますよね。少し癖がありますし、扱いづらさは否めないですが、同様にJSONのデータとして持たせることで実現できます。
こんな感じで配列にしてしまいます。
{
"_comments": [
"1行目のコメント",
"2行目のコメント"
],
"id": "hogehoge_id"
}
3. 複数のキーに対して、それぞれにコメント付けたい
要するにJavaScriptであれば、こういうことができます。
// TwitterのIDが入ってる
var id = "hogehoge_id";
// Twitterの名前
var name = "ほげほげ";
こんな感じでJSONファイルにも、それぞれの行に対してコメントを付けたい場合はどうするのが良いのでしょう?
こんなやり方があります。
{
"id": "TwitterのIDが入ってる",
"id": "hogehoge_id",
"name": "Twitterの名前",
"name": "ほげほげ"
}
JSONでは、キーが重複している場合、前に書いた方は無視されます。(上書きされます)
そのため、上記のような書き方ができます。ただ、可読性が落ちることは否めないですね。
4. JSONCを使う
もし、JSONCを使える環境であれば、これが最もスマートな解決策となります。
JSONCとは
JSONCは、コメントを含めることができるように拡張されたJSONです。JSONCでは、ブロック(/ * * /
)および単一行(//
)コメントを使用することができます。
Microsoft公式がparserを開発・公開しているため、かなり使いやすくなりました。Visual Studio Code では標準機能としてJSONCを取り扱うことができるようになっています。
書き方
特殊な書き方はないです。単純にJSONでコメントが使えるというだけです。
{
// これはTwitterのidです
"id": "hogehoge_id",
/*
この先は必須ではない
*/
"name": "ほげほげ",
"created": "2020/1/12",
}
ちなみに、JSONにコメントが書けるというだけではなく、リストの末尾の要素にカンマ「,」をつけることができるという点も地味ですが、慣れると助かるJSONCを使う利点です。
まとめ
JSONファイルにコメントを書く方法をいくつかご紹介しました。とりあえず私は、一番上の"_comment"
のパターンを使っています。
どれを使うかは好みの問題ですが、チーム開発なんかではもし使うのであれば、統一した方がいいでしょう。
余談:「json-c」は別物
余談ですが、「json-c」というプロジェクトがありますが、単なるC言語でJSONを利用するためのライブラリであり、今回紹介した「JSONC」とは関係がないものです。