你很近!雖然有幾件事情:
null
不'null'
- 管道後,您將與第一表達
- 像
null
的結果來工作,true
不是一個字符串(== true
也是多餘的)
jmespath.org有一個可用於測試表達式的實時編輯器。以下是我們可以用它來測試這種情況下,簡化的JSON:
{
"DistributionList": {
"Items": [
{
"Id": "foo",
"Aliases": {
"Quantity": 1,
"Items": [
"cname.cdn.mycompany.com"
]
}
},
{
"Id": "bar",
"Aliases": {
"Quantity": 1,
"Items": [
"cname.cdn.othercompany.com"
]
}
},
{
"Id": "baz",
"Aliases": {
"Quantity": 0
}
}
]
}
}
讓我們先從表達式的第一部分。你唯一需要的修復正在引號斷空:
DistributionList.Items[?Aliases.Items!=null]
這將成功地過濾掉不Items
元素Alias
下。這裏是你會得到什麼,如果你停止在這裏,什麼你必須與管道後,開始工作:
[
{
"Id": "foo",
"Aliases": {
"Quantity": 1,
"Items": [
"cname.cdn.mycompany.com"
]
}
},
{
"Id": "bar",
"Aliases": {
"Quantity": 1,
"Items": [
"cname.cdn.othercompany.com"
]
}
}
]
注意,沒有DistributionList.Items
了。
所以現在我們要過濾一個特定的CNAME。讓我們忽略重言式== true
。
[?contains(Aliases.Items, 'cname.cdn.mycompany.com')]
因此,充分表達現在是:
DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')]
和你的結果是成功篩選列表:
[
{
"Id": "foo",
"Aliases": {
"Quantity": 1,
"Items": [
"cname.cdn.mycompany.com"
]
}
}
]
現在如果你想匹配的元素標識的,只需添加.Id
到最後一個表達式。如果你知道只有一個,你可以用另一個管道選擇該元素,並且[0]
。
DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id | [0]
而你得到你想要的ID!
"foo"
謝謝你這個非常明確的解釋! :-) –