問題
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"}]
……続く