それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

jq コマンドなどで、JSONハイフン付のキーを取り出す方法

jq ではハイフンに意味がある

オブジェクトのキー名にハイフンが混じるとエラー

$ cat out | jq - .download-dir
jq: error: dir/0 is not defined at <top-level>, line 1:

なぜ?

だってJSってハイフンは引き算じゃん?

こう書いてしまうと、

obj.config ={".download-dir": "~/Downloads"}

obj.config.download-dir # あ!?

どう考えても、引き算じゃん?

obj.config.download-dir
(obj.config.download - dir)  // え?

なので、JSONにハイフンの引数を入れるのはあまり推奨されないけど、JSONを単なるシリアライズだとか、データ保存形式とか、設定ファイルだと思ってる方々はついついやりがちなのです。

jq ではクォートか、ハッシュアクセスを使う

jq でも同じです。ちゃんとクォートつけるか、「 [] 」 でアクセスする

# cat out | jq -ra '."download-dir"'
~/Downloads
root@acid:~# cat out | jq -ra '.["download-dir"]'
~/Downloads

だめな例

おかしがちなだめな例。

これは、ダブルクォーテーションマークが、Bashに解釈されるときに外されて jq まで届かない。

# cat out | jq -ra ."download-dir"

これは、jq がシェル経由という落としな穴。

JSON は意外な落としな穴がある。

何でもかんでもJSONってやめたほうが良いよまじで。手入力とか設定ファイルにはホント向いてないから。

手作業に向いてないってことはデバッグとかで、データ取り出しが本当に煩雑。