前口上
こんにちは. 技術顧問をやっている野又です。直近ではサーバーサイド(Rails)や画像認識, .NETのレビュー, 全体のマネジメントを行っています。
さて、jsonから必要な情報を使いたい時に使用するツールはなんでしょうか?jqコマンドが有名ですが、使い方が独特ですよね(個人の意見です)。可能なら慣れ親しんだシェルでgrepしたい. そんなときに便利なcatjの紹介
インストール
node.jsが必要です. README通りnpmで入れます.
npm install -g catj
サンプルデータ
以下のサンプルデータを使います
[ { "name": "burger", "category": "burger", "price": 400 }, { "name": "cheese burger", "category": "burger", "price": 500 }, { "name": "double cheese burger", "category": "burger", "price": 600 }, { "name": "cola", "category": "drink", "price": 100 }, { "name": "orange juice", "category": "drink", "price": 100 } ]
基本
$ catj sample.json .[0].name = "burger" .[0].category = "burger" .[0].price = 400 .[1].name = "cheese burger" .[1].category = "burger" .[1].price = 500 .[2].name = "double cheese burger" .[2].category = "burger" .[2].price = 600 .[3].name = "cola" .[3].category = "drink" .[3].price = 100 .[4].name = "orange juice" .[4].category = "drink" .[4].price = 100
grepと組み合わせる
jqとも比較してみましょう
nameだけ抽出
jq
$ cat sample.json |jq '.[].name' "burger" "cheese burger" "double cheese burger" "cola" "orange juice"
catj
$ catj sample.json |grep name .[0].name = "burger" .[1].name = "cheese burger" .[2].name = "double cheese burger" .[3].name = "cola" .[4].name = "orange juice"
index 1のみ抽出. catjのraw出力はカラーコードを含むようです
jq
$ cat sample.json |jq '.[1]' { "name": "cheese burger", "category": "burger", "price": 500 }
catj
$ catj sample.json |grep '\[.*1.*\]' .[1].name = "cheese burger" .[1].category = "burger" .[1].price = 500
簡単な例だとあまり変わらないですね. ネストが深いときにさくっとkeyの名前でフィルターかけられるのが売りだと思います.
制限
Issueに上がっていますが、現状だと逆操作(flat => json)はできないようです