次のjsonファイルがあります。
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
},
"BAZ": {
"name": "Jack",
"location": "Whereever"
}
}
私はjqを使用していて、 'location'が 'Stockholm'であるオブジェクトの "name"要素を取得したいです。
私は私がすべての名前を得ることができることを知っています
cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"
しかし、サブキーの値(ここでは"location" : "Stockholm"
)を考えると、特定のオブジェクトだけを印刷する方法を理解することはできません。
グーグルが主にjQueryのものを見つけた後、私はその答えをブログに投稿しました。
$ jq '.[] | select(.location=="Stockholm")' json
{
"location": "Stockholm",
"name": "Walt"
}
{
"location": "Stockholm",
"name": "Donald"
}
ここから: http://zerokspot.com/weblog/2013/07/18/processing-json-with-jq/
名前だけのストリームを取得するには
$ jq '.[] | select(.location=="Stockholm") | .name' json
生成されます:
"Donald"
"Walt"
対応する(キー名、「名前」属性)ペアのストリームを取得するには、以下の点を考慮してください。
$ jq -c 'to_entries[]
| select (.value.location == "Stockholm")
| [.key, .value.name]' json
出力:
["FOO","Donald"]
["BAR","Walt"]
私は同様の関連した質問をしました:もしあなたがオリジナルのオブジェクトフォーマットを戻したい(キー名、例えばFOO、BAR)ならどうでしょうか?
Jqは、オブジェクトとキーと値のペアの配列を変換するためにto_entries
とfrom_entries
を提供します。 selectの周りのmap
と一緒に
これらの関数は、オブジェクトとキーと値のペアの配列間の変換を行います。 to_entriesにオブジェクトが渡されると、入力の各k:vエントリに対して、出力配列に{"key":k、 "value":v}が含まれます。
from_entriesは逆の変換を行い、with_entries(foo)はto_entriesの省略形です。マップ(foo) from_entries。オブジェクトのすべてのキーと値に対して何らかの操作を行うのに役立ちます。 from_entriesは、キー、キー、名前、名前、値、および値をキーとして受け入れます。
jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
}
}
with_entries
の短縮形を使用すると、これは次のようになります。
jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
"FOO": {
"name": "Donald",
"location": "Stockholm"
},
"BAR": {
"name": "Walt",
"location": "Stockholm"
}
}