LoginSignup
8
5

More than 5 years have passed since last update.

jq の練習

Posted at

問題

jq が難しい。

解決策

練習し、慣れるしかない。

練習の記録

1. 数値や文字列などはそのまま処理される

echo '"abc"' | jq '1'
#=> 1

echo '{"a":1,"b":"2"}' | jq '"Hello, World!"'
#=> "Hello, World!"

echo '["a","b","c"]' | jq '[123]'
#=> [123]

echo '["a","b","c"]' | jq '{"a":456}'
#=> {"a":456}

2. . は id (そのままを返す)

※注意: 対象としてここでは JSON の root が渡されている

echo '"abc"' | jq '.'
#=> "abc"

echo '["a","b","c"]' | jq '.'
#=> ["a","b","c"]

echo '{"a":1,"b":"2"}' | jq '.'
#=> {"a":1,"b":"2"}

3. .key は Object の property access

echo '{"a":1,"b":"2"}' | jq '.a'
#=> 1

echo '{"a":1,"b":"2"}' | jq '.b'
#=> "2"

echo '{"a":1,"b":"2"}' | jq '.c'
#=> null

4. .key と Object を組み合わせてみる

echo '{"a":1,"b":"2"}' | jq '{ "k": .a }'
#=> {"k":1}

5. Object の key は JavaScript のように " を省略できる

echo '{"a":1,"b":"2"}' | jq '{ k: .a }'
#=> {"k":1}

6. { key: .key }{ key } と省略できる

echo '{"a":1,"b":"2"}' | jq '{ a }'
#=> {"a":1}

7. map() は Array の各要素、または Object の各 value を走査できる

※注意: map() の対象としては JSON の root を取る。

echo '["a","b","c"]' | jq 'map(1)'
#=> [1,1,1]

echo '{"a":1,"b":"2"}' | jq 'map("Hello")'
#=> ["Hello","Hello"]

8. map(). を組み合わせる (さきの例だと各要素かが分からないので……)

※注意: map() の対象としては JSON の root を取る……が、
map(.). は root でなく「各要素 or 各 value 」である。

echo '["a","b","c"]' | jq 'map(.)'
#=> ["a","b","c"]

echo '{"a":1,"b":"2"}' | jq 'map(.)'
#=> [1,"2"]

9. map().key を組み合わせてみる

echo '[{"k":"a"},{"k":"b"},{"k":"c"}]' | jq 'map(.k)'
#=> ["a","b","c"]

echo '[{"k":"a"},{"k":"b"},{"x":123}]' | jq 'map(.k)'
#=> ["a","b",null]

10. map().key{ key } を組み合わせてみる

echo '[{"k":"a"},{"k":"b"},{"x":123}]' | jq 'map({ k })'
#=> [{"k":"a"},{"k":"b"},{"k":null}]

11. select() で不要な要素を削る

※注意: JavaScript とは truthy / falsy の判定が異なる。
false null が falsy でそれ以外は truthy だと思う。

※注意: map(.). は各要素になるが、select(.) はそうならない。

echo 'true' | jq 'select(.)'
#=> true
# (`.` は `true` なので truthy)

echo 'false' | jq 'select(.)'
#=>
# (`.` は `false` なので falsy)

echo '0' | jq 'select(.)'
#=> 0
# (`.` は `0` なので truthy 。JavaScript だと `0` は falsy だが、jq では truthy)

echo '""' | jq 'select(.)'
#=> ""
# (`.` は `""` なので truthy。JavaScript だと `""` は falsy だが、jq では truthy)

echo 'null' | jq 'select(.)'
#=>
# (`.` は `null` なので falsy)

echo '{"k":"a"}' | jq 'select(.)'
#=> {"k":"a"}
# (`.` は `{"k":"a"}` なので truthy)

echo '{"k":"a"}' | jq 'select(.k)'
#=> {"k":"a"}
# (`.k` は `"a"` なので truthy)

echo '{"k":"a"}' | jq 'select(.a)'
#=>
# (`.a` は null なので falsy)

12. map()select() を組み合わせてみる

echo '[{"k":"a"},{"k":"b"},{"x":123}]' | jq 'map(select(.))'
#=> [{"k":"a"},{"k":"b"},{"x":123}]

echo '[{"k":"a"},{"k":"b"},{"x":123}]' | jq 'map(select(.k))'
#=> [{"k":"a"},{"k":"b"}]

……続く

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5