cli で json を生成したいと思うことがそこそこある。
httpie
httpie の引数みたいに作れたらいいなと思っていたこともあった。実は offline
オプションを使えばそのままできる。
$ http --offline -p B PUT localhost key1=value1 key2=value2
{
"key1": "value1",
"key2": "value2"
}
ところが普通に作っても、それほど変わらない。
$ echo '{"key1":"value1","key2":"value2"}' | jq .
{
"key1": "value1",
"key2": "value2"
}
httpie は、浅い json を扱うのには適しているけれど、深いネスト形式になると苦しい。残念。
jq
長い文字列をまるっと安全にフィールドに格納したいときに raw input + slurp が便利。
$ cat server.crt | jq -R -s '{"server":{"cert":.}}'
{
"server": {
"cert": "-----BEGIN CERTIFICATE-----\nMII (中略) iXK\n-----END CERTIFICATE-----\n"
}
}
json の merge は slurp
オプションを使うと簡単。
$ jq -s '.[0] * .[1]' <(echo '{"key1":"value1"}') <(echo '{"key2":"value2"}')
{
"key1": "value1",
"key2": "value2"
}
--arg
, --argjson
, --slurpfile
, --rawfile
と null input を使うと組み立て専用な感じになる。
$ jq -n '{"a":$a, "b":$b}' --arg a hello --arg b world
{
"a": "hello",
"b": "world"
}