2016-03-29 98 views
2

項目拖放我有一個JSON文件,它看起來像這樣(粗略模式):JQ:選擇不從陣列

[{ 
    "custom_variables": [ 
     { 
      "name": "xxx", 
      "value": "xxx" 
     }, 
     { 
      "name": "xxx", 
      "value": "xxx" 
     }, 
     { 
      "name": "profile_id", 
      "value": "123" 
     } 
    ], 
    // many fields 
    "xxx": "xxx", 
    "xxx": "xxx", 
    "xxx": "xxx" 
}] 

我使用JQ提取從頂層對象中的所有領域。 custom_variables字段構成一個包含名稱和值的對象數組。

我想從custom_variables中提取一個特定的對象,並給定它的名字。

所以我在做什麼是這樣的:

jq 'map(
    { 
     xxx: .xxx, 
     xxx: .xxx, 
     xxx: .xxx, 
     xxx: .custom_variables | .[] | select(.name == "variable_name") 
    } 
)' 

它幾乎工程;它獲取我想要的變量,但當它不存在時(或者如果custom_variables本身不),它將刪除整個頂級對象。所以最後我得到了更少的對象,然後我把腳本放進去了。

我如何才能返回null如果我沒有找到該字段,但仍然保留其餘的數據?

回答

0

這個工程,但它看起來很醜。有更好的解決方案

custom_variables: (if (.custom_variables | length > 0) 
      then (.custom_variables | .[]? | select(.name == "variable_name") | .value | scan("\\d+")) 
      else null 
      end) 
1

使用替代操作者(//)來轉換零個元素(如那些可以通過select.[]來產生)轉換成的值的流:

jq 'map(
    { 
     xxx: .xxx, 
     xxx: .xxx, 
     xxx: .xxx, 
     xxx: .custom_variables | .[] | select(.name == "variable_name") // null 
    } 
)' 

這將具有.xxx是當在//的左側存在零元素流時,可以使用null

可以,當然,將替代操作者在不同的位置在較早或較晚的階段捕獲零元素流,如在對象級別:

jq 'map(
    { 
     xxx: .xxx, 
     xxx: .xxx, 
     xxx: .xxx, 
     xxx: .custom_variables | .[] | select(.name == "variable_name") 
    } // {} 
)' 
0

下面做什麼你已經表明你想要,盡我所能瞭解你的要求。

map(if .custom_variables 
    then .custom_variables |= (map(select(.name == "variable_name") | .value) 
           | .[0]) 
    else . 
    end) 

示例輸入:

[{ 
    "custom_variables": [ 
     { 
      "name": "xxx", 
      "value": "xxx" 
     }, 
     { 
      "name": "xxx", 
      "value": "xxx" 
     }, 
     { 
      "name": "variable_name", 
      "value": "123" 
     } 
    ], 
    "xxx1": "xxx", 
    "xxx2": "xxx", 
    "xxx3": "xxx" 
}, 

{ 
    "yyy1": "yyy", 
    "yyy2": "yyy", 
    "yyy3": "yyy" 
} 
] 

輸出:

[ 
    { 
    "custom_variables": "123", 
    "xxx1": "xxx", 
    "xxx2": "xxx", 
    "xxx3": "xxx" 
    }, 
    { 
    "yyy1": "yyy", 
    "yyy2": "yyy", 
    "yyy3": "yyy" 
    } 
]