你很近!虽然有几件事情:
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"
谢谢你这个非常明确的解释! :-) –