你很亲密!不过有几点:
null
不是'null'
- 在管道之后,您将使用第一个表达式的结果
- like
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
under的元素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,只需添加.Id
到最后一个表达式。如果您知道只有一个,您可以使用另一个管道选择该元素,然后[0]
.
DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id | [0]
你得到你想要的ID!
"foo"