読者です 読者をやめる 読者になる 読者になる

13日の金曜日に怪物と戦うために #vgadvent2013

VOYAGEGROUP 元android事業室の@DayBySayです。

このたび、android事業室はandroid事業本部になりました。( ゚Д゚ノノ☆パチパチパチパチ
ありがとうございます。

ということで、本日は13日の金曜日に襲ってくるであろう怪物と戦うために、準備するべきことを書いてみたいと思います。

※ この記事は VOYAGE GROUP エンジニアブログ : Advent Calendar 2013 の13日目の記事です。


13日の金曜日といえばこいつですね。

そう、皆さんご存知の

f:id:DayBySay:20081208180741j:plain


そう、JSONです。
きっとNOWいみなさんは何かの設定ファイルとしてJSONを使っちゃったりしちゃってるんじゃないかなと思います。僕は使ってませんが。


と、いうことで今日はキャンプに行った先に急にJSONに襲われても大丈夫なように、事前の準備をしてみようと思います!

1. JSONのことを知る

敵を知り己を知れば百戦危うからずと昔の偉い人が言っていたらしいです。

まずはJSONがどんな仕様なのか、今一度見てみましょう!

http://www.json.org/JSON


JSONを直接手で書く時によくやってしまう失敗として、

文字列を囲むのににシングルクォートを使ってしまったり、[ ] を用いて配列の表現をする際、カッコ内で{}で囲まずにKey Valueを並べちゃったりなどなど。

自分自身いくつか思いあたる点がありますが、そこは仕様をしっかりと確認することで無くせるミスだと思います。

ありがちなミスや、忘れがちな細かい仕様など、こちらのページにわかりやすくまとまっていて勉強になりました。

もう一度、ちゃんとJSON入門


2. 武器を研ぎ澄ます

武器とは・・・エディタですね!

JSONと戦うときにエディタはよく出てくるとおもいますので(?)しっかりと対策をしておきましょう。


vim-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を入れることで、この少し寂しい寂しい文字たちが
f:id:DayBySay:20131213020517p:plain

こんな感じですこし賑やかになります!
f:id:DayBySay:20131213020500p:plain

うーん、見た目的に楽しげ!

テンションを上げるためにも見た目を良くするのは大事ですね!


neat-json
neat-jsonは、vimのプラグインで、開いているファイル上のJSONを整形してくれるツールです。

NeoBundleを使っていれば、.vimrc に以下を追加することでインストールできます。

 NeoBundle ‘5t111111/neat-json.vim’

NeoBundleについてはこちら


例えば次のようにvimでJSONを編集していたとします。

f:id:DayBySay:20131213020517p:plain

この状態で、 :NeatJson コマンドを実行すると・・・

f:id:DayBySay:20131213020650p:plain

こんな感じでインデントをつけてくれます。便利!(JSONが正しくない場合はコケます

何故か並びがアルファベット順になっていますが、この際気にしません。
そのへんは余力があるときにもうちょっと調べてみようと思います!

3. 飛び道具を使う

JSONをいじるときに助けてくれるコマンドラインツールはいくつか存在しており、それらも便利なので紹介させていただきます。


yajl

高速(らしい)な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

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倍は為になることを書いていただけるはずなので、皆様お楽しみに!