JSON設定ファイルの分割

Last-modified: 2015-03-12 (木) 00:25:57

JSON設定ファイルは大きくなってくると、編集が大変です。設定ファイルを分割しましょう。ここではマクロプロセッサm4を使った分割方法を紹介します。

マクロプロセッサm4

m4はUNIX系OSで古くから使われているマクロプロセッサです。Windowsバイナリはググるとなぜか管理者権が必要なものがヒットしますが、ただのテキスト処理に管理者権はナンセンスなので、管理者権を要求しないバイナリを置いておきます。

gnu-m4-1.4.14.zip

使い方

m4にJSON設定ファイルを読み込ませることになるので、JSON設定ファイルをm4マクロ言語で書くことになります。しかし、マクロ呼び出しを書かなければ、通常のテキストはそのまま出力されるので、特に書き換える必要はありません。

マクロなので、

define(`MY_MACRO',`マクロが展開されるよ~')
MY_MACRO。MY_MACRO!

と書いてm4に読み込ませると、

マクロが展開されるよ~。マクロが展開されるよ~!

という出力が得られますが、ただファイルを分割したいだけなので、こういう普通の使い方はどうでもいいのです。

ファイルを分割する場合は、includeを使って最終的に1つのファイルに展開されるようにします。

  • main.jsonファイル
    {
    include(subA.json)
    "hoge": 3,
    include(subB.json)
    }
  • subA.json
    "sub-a": 1,
  • subB.json
    "sub-b": [
        1,2,3,4
    ],

という3つのファイルを用意して、

m4.exe main.json > out.json

を実行すると、out.jsonは、

{
"sub-a": 1,
"hoge": 3,
"sub-b": [
    1,2,3,4
],
}

となります。

m4を起動するバッチファイルを用意すると簡単に使えるようになります。例えば、以下のようにします。

  • 設定ファイルフォルダの構成
    ┣ main.json
    ┣ subA.json
    ┣ subB.json
    ┣ ...(分割した設定ファイルがあるだけ)
    ┣ m4.exe
    ┣ regex2.dll
    ┗ out.bat
  • out.batの中身
    cd /d %~dp0
    m4.exe main.json > "<出力先JSON>"

JSON中でマクロを意図せず呼び出してしまう可能性

includeはm4の組み込みマクロです。組み込みマクロは最初から使えるようになっているので、もしかしたら、組み込みマクロの名前がJSON中にあって、意図せず呼び出してしまうことがあるかもしれません。
引数を取るものは後ろに()がないとマクロ呼出しと認識されないので、意図しない呼び出しはほぼないと思いますが、一応、そういうこともあると心の隅に置いておいてください。

組み込みマクロ一覧
http://kaworu.jpn.org/doc/FreeBSD/jman/man1/m4.1.php