LoginSignup
0
0

jq 1.7の新機能ーキー連鎖時の . と [] の用法

Last updated at Posted at 2024-04-05

JSON処理のコマンドラインツールであるjqが、5年ぶりにアップデートしました。現在の最新は1.7.1(2023年12月リリース)です。1.6からいろいろと改定や新機能の追加があって、ますます楽しくなっています。

全容はGithub上のリリースノートを見ていただくとして、今日はネストされた構造型データ(オブジェクトおよび配列)のツリーを下って値を抽出するときの.[]についてです。

次のように、2重にネストされたJSONオブジェクトを考えます(環境変数DONに収容されているとします)。

$ DON='{"どんぶり": {"かつ": 600, "親子": 550}}'
$ echo $DON | jq '.'
{
  "どんぶり": {
    "かつ": 600,
    "親子": 550
  }
}

これまでは

ネストされたオブジェクトの値にアクセスするには、プロパティキーをドット.でつなぎます。マニュアルはこの記法を「オブジェクト識別子インデックス」と呼んでいます(object identifier-index)。上記の数値(かつ丼の値段)を取得するには次のようにします。

$ jq-1.6 --version                          # 1つ前の1.6を使います
jq-1.6

$ echo $DON | jq-1.6 '."どんぶり"."かつ"'
600

英数文字なら.donburi.katsuのように書けますが、それ以外のUTF-8文字では二重引用符"でくくらなければならないところがポイントです。

[]でキーをくくった記法も使えます。オブジェクトインデックスです(object index)。

$ echo $DON | jq-1.6 '.["どんぶり"]["親子"]'
550

ただし、[].は混ぜては使えません。

$ echo $DON | jq-1.6 '.["どんぶり"].["親子"]'  # 混ぜるな危険
jq: error: syntax error, unexpected '[', expecting FORMAT or 
	QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.["どんぶり"].["親子"]
jq: 1 compile error

JavaScriptでは

他の言語系でも事情は同様です。Node.jsで試してみると、やはり混ぜてはダメです。

$ node
Welcome to Node.js v20.9.0.
Type ".help" for more information.

# ドットチェーン
> JSON.parse('{"どんぶり": {"かつ": 600, "親子": 550}}').どんぶり.親子
550

# 角括弧記法
> JSON.parse('{"どんぶり": {"かつ": 600, "親子": 550}}')["どんぶり"]["親子"]
550

# 混ぜるな危険
> JSON.parse('{"どんぶり": {"かつ": 600, "親子": 550}}').["どんぶり"].["親子"]
JSON.parse('{"どんぶり": {"かつ": 600, "親子": 550}}').["どんぶり"].["親子"]
                                               ^
Uncaught SyntaxError: Unexpected token '[

これからは

.[]を混ぜた記法も認められます。

$ jq --version
jq-1.7.1                                    # 1.7です

$ echo $DON | jq '.["どんぶり"].["親子"]'      # 混ぜてもOK
550

$ echo $DON | jq '."どんぶり".["親子"]'        # 一方だけもあり
550

$ echo $DON | jq '.["どんぶり"]."親子"'        # ditto。今度は反対側
550

おわりに

他の言語で慣れていれば混用ミスなどありえない、と思うかもしれませんが、jqではやっちゃったりすることもあります。

というのも、パイプを使うときは、その時点のツリー上の位置を参照するのに.が必要だからです。

$ echo $DON | jq-1.6 '.["どんぶり"] | .["かつ"]'
600

そのため、パイプを整理するときに.を消し忘れたり、逆に、.の連鎖だと読みにくいからとパイプを挟んだりと、フィルタをいじっていると、ミスをしがちです。単純にパイプを挟んだり消したりしても動作するようになったのは、その点、ありがたいものです。

1.7では、他にも、細かいところで性能向上も図られています。まだ1.6をお使いなら、これを機会に1.7にアップグレードしましょう。

参考

表紙 表紙

0
0
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
0
0