逻辑与的jsonpath

问题描述 投票:0回答:1

我需要一个 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')]

谢谢

jsonpath
1个回答
0
投票

要使用 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 上进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.