我需要一个 Jsonpath 来检查 input.json 中的凭据,如下所示。
{
"Attributes": {
"Attribute": [
{
"name": "uid",
"value": "account1"
},
{
"name": "pwd",
"value": "secret"
}
]
}
}
以下每个条件单独起作用。但我找不到一种方法将它们逻辑“与”在一起。
$.Attributes.Attribute[?(@.name == 'uid' && @.value == 'account1')]
$.Attributes.Attribute[?(@.name == 'pwd' && @.value == 'secret')]
喜欢
$.Attributes.Attribute[?(@.name == 'uid' && @.value == 'account1')] && $.Attributes.Attribute[?(@.name == 'pwd' && @.value == 'secret')]
谢谢
要使用 JSON Path 执行此操作,您需要迭代更高一层,以使用嵌套过滤器查询查找包含这两个对象的子数组。
$.Attributes[?@[[email protected] == 'uid' && @.value == 'account1'] && @[[email protected] == 'pwd' && @.value == 'secret']]
这是细分:
$
.Attributes // enter object
[? // iterate and find a value that
@[? // has a child that
@.name == 'uid' && // matches condition 1
@.value == 'account1'
]
&& // and
@[? // has a child that
@.name == 'pwd' && // matches condition 2
@.value == 'secret'
]
]
它的工作原理是查找 Attributes
中包含您要查找的两个项目的
any元素。因此,如果
Attributes
有其他孩子,它也会查看这些孩子。
{
"Attributes": {
"Attribute1": [
{
"name": "uid",
"value": "account1"
},
{
"name": "pwd",
"value": "secret"
}
],
"Attribute2": [
{
"name": "uid",
"value": "account2"
},
{
"name": "pwd",
"value": "secret"
}
]
}
}
为此,它仅返回第一个(在
Attribute1
下)。
{
"Attributes": {
"Attribute": [
{
"name": "uid",
"value": "account1"
},
{
"name": "pwd",
"value": "secret"
}
],
"Attribute2": [
{
"name": "uid",
"value": "account1"
},
{
"name": "pwd",
"value": "secret"
}
]
}
}
为此,它将返回两者。
这只有效,因为数组嵌套在另一个结构化值(数组/对象)下。如果数组位于根,例如
[
{
"name": "uid",
"value": "account1"
},
{
"name": "pwd",
"value": "secret"
}
]
那么你就无法做你想做的事。你必须有嵌套迭代才能完成这项工作。
您可以在运行 .Net WASM 的 我的 Playground 上进行测试。