整形されていない json を持ってきて vim で見やすく整形したい。
- 例えばどこかのAPIを叩いて取得した値
- 例えばどこかのドキュメントに載っている値
- 例えばサンプルをドキュメントに残すために手作業で作った値
などなど。1番目の例であればブラウザの拡張を使うことで、綺麗に表示できたりもしますが、2番目3番目の場合に vim にぺたっと貼り付けて整形できると、便利そうです。
python2.6以降がインストールされている環境で(python コマンドに PATH が通っている状態で)、下記コマンドを叩くとバッファ内の json 文字列を整形することができます。
:%!python -m json.tool
例えば、こんな文字列がバッファに入っている時に上記コマンドを叩くと
{"count":1,"list":[{"url":"http://json.org/example.html","title":"\u3042\u3044\u3046\u3048\u304a"}]}
こんな感じになります。
{
"count": 1,
"list": [
{
"title": "\u3042\u3044\u3046\u3048\u304a",
"url": "http://json.org/example.html"
}
]
}
良い感じです。しかし、日本語がエスケープされたままではあまり嬉しくありません(また行末尾に半角スペースが入っていたりするのも気になります)。というわけで、少し改良したコマンドを作ってみました。vim 初心者なので、ツッコミもらえると嬉しいです。
command! JsonFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)), sys.stdin.read()))"'
\ | :%s/ \+$//ge
\ | :set ft=javascript
\ | :1
簡単に説明を書くと
- python の json.tool で整形
- "\u307d" のような unicode 文字列をデコード
- 各行の末尾にスペースが入るので削除
- vim の filetype を javascript にしてハイライト表示
- カーソルを先頭行に移動
コマンドを実行すると
:JsonFormat
下記のような表示になります。
{
"count": 1,
"list": [
{
"title": "あいうえお",
"url": "http://json.org/example.html"
}
]
}