簡體   English   中英

jq - 當我已經深入到對象的子項中時,如何打印對象的父值?

[英]jq - How do I print a parent value of an object when I am already deep into the object's children?

假設我有以下JSON,存儲在我的變量jsonVariable中

{
    "id": 1,
    "details": {
        "username": "jamesbrown",
        "name": "James Brown"
    }
}

我使用以下代碼使用jq解析此JSON:

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")'

這會給我輸出

詹姆斯布朗

但是如果我想得到這個人的身份怎么辦? 現在,我知道這是一個粗略而簡單的例子 - 我正在使用的程序是5或6級深度,除了select之外還有許多不同的JQ函數。 在執行各種過濾方法后,當我已經深入5或6層時,我需要一種方法來選擇父項的字段。

有人可以幫忙嗎? 是否有任何“反向”的方式,回到父母身邊? (不確定我是否有意義!)

對於更通用的方法,將“父”元素的值保存在所需的詳細級別,然后將其傳遞到過濾器的末尾:

jq '. as $parent | .details.name | select(. == "James Brown") | $parent'

當然,對於你揭露的瑣碎案例,你可以完全省略:

jq 'select(.details.name == "James Brown")'

另外,請考慮如果您選擇的過濾器為單個父對象返回許多匹配項,您將收到每個匹配項的父對象的副本。 您可能希望確保您的選擇過濾器僅通過將父級別下​​的所有匹配包裝到數組中而在父級別返回一個元素,或者使用unique對最終結果進行重復數據刪除。

試一試:

echo $jsonVariable | jq '{Name: .details.name, Id: .Id}  | select(.name == "James Brown")'

您可以查詢包含您要查詢的值的根對象以及您要選擇的值,而不是查詢您正在測試的值。

您需要包含idname的對象。

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM