13日の金曜日に怪物と戦うために #vgadvent2013
VOYAGEGROUP 元android事業室の@DayBySayです。
このたび、android事業室はandroid事業本部になりました。( ゚Д゚ノノ☆パチパチパチパチ
ありがとうございます。
ということで、本日は13日の金曜日に襲ってくるであろう怪物と戦うために、準備するべきことを書いてみたいと思います。
※ この記事は VOYAGE GROUP エンジニアブログ : Advent Calendar 2013 の13日目の記事です。
13日の金曜日といえばこいつですね。
そう、皆さんご存知の
そう、JSONです。
きっとNOWいみなさんは何かの設定ファイルとしてJSONを使っちゃったりしちゃってるんじゃないかなと思います。僕は使ってませんが。
と、いうことで今日はキャンプに行った先に急にJSONに襲われても大丈夫なように、事前の準備をしてみようと思います!
1. JSONのことを知る
敵を知り己を知れば百戦危うからずと昔の偉い人が言っていたらしいです。
まずはJSONがどんな仕様なのか、今一度見てみましょう!
JSONを直接手で書く時によくやってしまう失敗として、
文字列を囲むのににシングルクォートを使ってしまったり、[ ] を用いて配列の表現をする際、カッコ内で{}で囲まずにKey Valueを並べちゃったりなどなど。
自分自身いくつか思いあたる点がありますが、そこは仕様をしっかりと確認することで無くせるミスだと思います。
ありがちなミスや、忘れがちな細かい仕様など、こちらのページにわかりやすくまとまっていて勉強になりました。
2. 武器を研ぎ澄ます
武器とは・・・エディタですね!
JSONと戦うときにエディタはよく出てくるとおもいますので(?)しっかりと対策をしておきましょう。
vim-jsonはvimにおけるJSON用のfiletypeプラグインです。
使うにはpathogenをセットアップし、bundle以下にvim-jsonをcloneしてくればオケオケオッケーです。
まずはpathogenをとってきます。
$ mkdir -p ~/.vim/autoload ~/.vim/bundle $ curl 'www.vim.org/scripts/download_script.php?src_id=19375' > ~/.vim/autoload/pathogen.vim
次に、.vimrcに以下の記述を加えます
call pathogen#infect()
そして、vim-jsonをbundle以下にクローンしてきます。
$ cd ~/.vim/bundle
$ git clone https://github.com/elzr/vim-json.git
vim-jsonを入れることで、この少し寂しい寂しい文字たちが
こんな感じですこし賑やかになります!
うーん、見た目的に楽しげ!
テンションを上げるためにも見た目を良くするのは大事ですね!
neat-json
neat-jsonは、vimのプラグインで、開いているファイル上のJSONを整形してくれるツールです。
NeoBundleを使っていれば、.vimrc に以下を追加することでインストールできます。
NeoBundle ‘5t111111/neat-json.vim’
NeoBundleについてはこちら
例えば次のようにvimでJSONを編集していたとします。
この状態で、 :NeatJson コマンドを実行すると・・・
こんな感じでインデントをつけてくれます。便利!(JSONが正しくない場合はコケます
何故か並びがアルファベット順になっていますが、この際気にしません。
そのへんは余力があるときにもうちょっと調べてみようと思います!
3. 飛び道具を使う
JSONをいじるときに助けてくれるコマンドラインツールはいくつか存在しており、それらも便利なので紹介させていただきます。
高速(らしい)なJSONパーサ
Macであれば、brewでインストールすることができます。
brew install yaji
いれると、json_verifyコマンドが使えるようになります
例えばこんな閉じカッコを忘れたJSONがあったとき
{"名前":"ジェイソン", "日付":"13日の金曜日","武器":[{"右手":"ナタ","左手":"斧"}]
json_verifyコマンドを使うことで、テキストの形式がJSONとして正しいかどうか教えてくれます。
$cat example.json |json_verify parse error: premature EOF (right here) ------^ JSON is invalid
今回はinvalidでした。
閉じカッコを付けてあげることで、validになりました。
{"名前":"ジェイソン", "日付":"13日の金曜日","武器":[{"右手":"ナタ","左手":"斧"}]}
$cat example.json |json_verify
JSON is valid
jsonpp
JSONを単純に整形して表示したいだけの場合jsonppが使えるかも知れません。
これもbrewでインストールできます。
brew install jsonpp
jsonppはjsonのインデントを整えてくれるコマンドです。
例えばこんなJSONを普通にcatすると
$cat example.json {"名前":"ジェイソン", "日付":"13日の金曜日","武器":[{"右手":"ナタ","左手":"斧"}]}
になりますが、jsonppに渡してあげると
$cat example.json | jsonpp { "name": "ジェイソン", "date": "13日の金曜日", "wepon": [ { "右手": "ナタ", "左手": "斧" } ], "helmet": "ホッケーマスク", "map": [ { "1": "キャンプ場", "2": "クリスタルレイク" } ] }
みやすくなりました。
jqを使うと更に高度なJSONいじりが可能になります。
jqもbrewでインストールできます。
brew install jq
jqはインデントを整えるだけではなく、データの絞り込みを行うことができます。
たとえば、次のようなJSONがあった時、配列の添字的にアクセスしてデタを抽出することが出来ます。
$cat victim.json | jq . [ { "name": "パメラ", "gender": "female" }, { "name": "アリス", "gender": "female" }, { "name": "ダイアナ", "gender": "female" }, { "name": "ポール", "gender": "male" }, { "name": "デューク", "gender": "male" } ]
$cat victim.json | jq .[0] { "name": "パメラ", "gender": "female" }
次のように書くことで、キーを指定した値の抽出が出来ます。
$cat victim.json | jq ".[].name" "パメラ" "アリス" "ダイアナ" "ポール" "デューク"
また、map selectを使うことで、条件を指定した絞り込みができます。
$cat victim.json | jq 'map(select(.["gender"] == "male"))' [ { "name": "ポール", "gender": "male" }, { "name": "デューク", "gender": "male" } ]
なんて便利!
もちろんcurlなどでapi叩いた結果をパイプで渡すこともできるので、レスポンスから直接弄りたいときにも使えるかもしれませんね。
てかjqいじってたらエラーも吐いてくれるしエラーの行も教えてくれるので、JSONをいじいじする際にこれだけあれば十分なのではという気がしてきました。。jqすごい
以上、JSONと戦うために役に立ちそうな道具を何点か紹介させていただきました。
これらを完備しておけば、キャンプ場で急にJSONに襲われた時も死なずにすむかもしれませんね!
次回は先輩エンジニア @lesamoureuses さんです。
僕より500倍は為になることを書いていただけるはずなので、皆様お楽しみに!