jsonにコメントを書きたいがためだけの…つぅーまっちな何かしら

この記事を読んで、きゃーすてきーと思ってはいけない。

jsonにまつわるやや不愉快な点については、これまで二つばかり叫んでみたりもした。LooseJSONDecoderの件と、ConfigParserの件ね。ほかにもminifyな話も言ったことがある。

それらを叫んでいた際に気付いてなかったわけではないんだけれど、わりかし敷居の低い「えれえがんと」なやり方ってのはあるにはあり、そして「あえて言わないようにしてた」。ま、言わなかった理由は後述として、たとえばこういうことさね:

1 import io
2 import json
3 from mako.template import Template # require mako. if you dont have it, do "pip install mako".
4 
5 jsontext_what_we_want = Template(io.open("mydef.jsont", encoding="utf-8").read()).render()
6 obj_what_we_want = json.loads(jsontext_what_we_want)

なんだステキじゃないかぁ、と:

mydef.jsont | jsonのようでそうでもないjson
 1 {
 2     "inputs": [
 3         {
 4             "orig": "hoge.mkv",
 5             "trim": ["00:31:51.410", "00:35:14.200"],
 6             "target_time": [
 7                 ["00:32:13.000", "00:32:13.700", [1, "", "volume=0.0025"]]
 8 <%doc>一時的にコメントアウトしとくねーっ
 9                 , ["00:32:33.530", "00:32:34.265", 0]
10 </%doc>
11             ]
12         }
13     ]
14 }

何が「アカン」のか、一つはすぐにわかるかいね。わかって欲しいかなぁ。「html内にjavascriptを埋め込む」際のソースを読み書きする苦痛にお馴染みなら、わかるよね? 上で pygments がしっかり騙されちゃってるのと同じく、「syntax highligting やその他コードアシスト」の恩恵を受けにくくなるのよ、こういう「ちゃんぽん」てさ。

つまり、「デメリット」は以下の通り:

  1. Python は Ruby と違って、こういう高機能テンプレートエンジンは「組み込み」ではなく、(ここで例にした Mako などの)サードパーティー製のライブラリを別途インストールする必要がある。
  2. 開発環境(特にエディタ)の機能の恩恵を犠牲にしがちである。
  3. テンプレートエンジンの特殊文字などのエスケープとの格闘のはじまりはじまり。

json と mako の相性はそれほど悪くないとは思う。ただ、たとえば ${var} などに逐一反応してしまうので、これは特にシェルスクリプトととの組み合わせはなかなかに最悪だったりする。json だと文字列の中に埋め込まない限りは mako のスペシャルな仕様と衝突はしない。

というわけで、はっきりいって「json にコメントを入れたい」だけのために背負いこむデメリットなのかどうか、てのが微妙で、まぁそういうわけであえて言ってこなかったというわけ。ただこういうの、言わないと気付かない人も結構多いと思うわけで。なので、今日今ワタシが欲しくなったタイミングなので、あえて今更紹介しとこうかなと思った次第。