jqでjsonを解析しようとしています。
{
"xxx": {
"aliases": {
"business_event": {
"is_write_index": true
}
},
"mappings": {
"business_event_doc": {
"properties": {
"clientName": {
"type": "keyword"
},
"componentName": {
"type": "keyword"
},
"correlationId": {
"type": "keyword"
},
"executionTime": {
"type": "long"
},
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
}
}
}
}
}
結果が次のようにtype == "text"のプロパティリストを設定する必要があります。
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
セレクタを試してみましたが、結果が無効です。
.xxx.mappings[].properties | select (.[].type=="text")
子ノードを照会して親ノードを返す正しい方法は何ですか?
答え1
問題
.xxx.mappings[].properties | select(.[].type=="text")
はい、select
オブジェクト全体(配列ではない)は、properties
子オブジェクトが含まれている回数だけ選択されます.type == "text"
。
ここで使用できますwith_entries
:
jq '.xxx.mappings[].properties | with_entries(select(.value.type == "text"))' file
これはwith_entries
属性を繰り返す。select
次の要素の配列を取得します。
{
"key": "clientName",
"value": {
"type": "keyword"
}
}
select
要素を選択.value.type == "text"
して、通常のオブジェクトに置き換えます。
出力は次のとおりです
{
"fullDescription": {
"type": "text"
},
"shortDescription": {
"type": "text"
}
}
JSONドキュメントには「プライマリ」キー(キーはオブジェクトの一部ではない)を含めることができないため、要求された出力の正確な形式は有効なJSONではありません。
答え2
代替策を検討したい場合は、以下はwalk-path unixユーティリティに基づく代替案です。jtc
:
bash $ <file.json jtc -w'[type]:<text>:[-1]' -l
"fullDescription": {
"type": "text"
}
"shortDescription": {
"type": "text"
}
bash $
walk-path( -w
) はここで非常に簡単です:
[type]:<text>:
- 再帰的にそれぞれ(すべて)を探し、見つかった"type": "text"
項目で探します。[-1]
- レベル1(Jsonツリー)をバックアップして、その親エントリを効果的に選択します。
-l
歩行アイテムの印刷を示すラベル
jtc
PS>公開:私はこのツールの作成者です。