JMESPath 过滤对象而不是数组

JMESPath to filter on object instead of array

抱歉,我试过了,但就是无法让我的 JMESPath 过滤工作来过滤 Github GraphQL 用于私有存储库。

这是我要过滤的 Github GraphQL 结果:

{
  "data": {
    "repositoryOwner": {
      "repositories": {
        "edges": [
          {
            "node": {
              "name": "foo",
              "isFork": false,
              "isPrivate": true,
              "createdAt": "2019-04-25T20:31:07Z",
              "updatedAt": "2019-04-30T03:44:30Z",
              "primaryLanguage": {
                "primaryLanguage": "JavaScript"
              }
            }
          },
          {
            "node": {
              "name": "bar",
              "isFork": false,
              "isPrivate": true,
              "createdAt": "2019-04-25T01:26:31Z",
              "updatedAt": "2019-04-28T23:16:03Z",
              "primaryLanguage": {
                "primaryLanguage": "JavaScript"
              }
            }
          },
          {
            "node": {
              "name": "fur",
              "isFork": false,
              "isPrivate": false,
              "createdAt": "2019-04-25T02:46:28Z",
              "updatedAt": "2019-06-12T15:46:30Z",
              "primaryLanguage": {
                "primaryLanguage": "JavaScript"
              }
            }
          },
          {
            "node": {
              "name": "blog",
              "isFork": false,
              "isPrivate": false,
              "createdAt": "2013-03-17T13:37:44Z",
              "updatedAt": "2019-06-08T02:58:44Z",
              "primaryLanguage": null
            }
          },
          {
            "node": {
              "name": "blogs",
              "isFork": false,
              "isPrivate": true,
              "createdAt": "2015-12-06T03:52:14Z",
              "updatedAt": "2016-02-27T05:17:52Z",
              "primaryLanguage": {
                "primaryLanguage": "CSS"
              }
            }
          }
        ]
      }
    }
  }
} 

我试过了

data.repositoryOwner.repositories.edges.node[?isPrivate==`true`]
data.repositoryOwner.repositories.edges[].node[?isPrivate==`true`]
data.repositoryOwner.repositories.edges[].[node[?isPrivate==`true`]]

但是其中 none 给了我想要的列表,因为 https://jmespath.org/tutorial.html 中的每个示例都是关于对数组元素进行过滤的,而我上面的不是。

类似情况,

curl -s https://api.github.com/repos/golang/go/events | jp "[?type=='IssuesEvent'].payload.{Title: issue.title, URL: issue.url, User: issue.user.login, Event: action}"

如何在 payload.action=='created' 上进一步过滤(在不使用管道的情况下)?

更新2:

答案是,

[?type=='IssueCommentEvent' && payload.action=='created'].payload.{Title: issue.title, URL: issue.url, User: issue.user.login, Event: action}

我们将得到:

[
  {
    "Title": "x/website: post https://go.dev/blog/tidy-web contains a broken link",
    "URL": "https://api.github.com/repos/golang/go/issues/47975",
    "User": "ilikegolang",
    "Event": "created"
  },
  {
    "Title": "cmd/compile: pointer to concrete type doesn't satisfy generic type method set",
    "URL": "https://api.github.com/repos/golang/go/issues/48512",
    "User": "DmitriyMV",
    "Event": "created"
  },
  {
    "Title": "How to solve this problem, run gomobile bind-target = android to report an error ",
    "URL": "https://api.github.com/repos/golang/go/issues/48510",
    "User": "ytxyyt",
    "Event": "created"
  },
. . .
]

请帮忙。

更新:

我问,“因为 https://jmespath.org/tutorial.html 中的每个示例都是关于过滤数组元素的,而我上面的不是”,并得到:

In order to filter, you will need an array.

然而,这不是我所期望的,因为以第一个为例,我希望过滤后的是一个 JSON 数组:

[
      {
          "name": "foo",
          "isFork": false,
          "isPrivate": true,
          "createdAt": "2019-04-25T20:31:07Z",
          "updatedAt": "2019-04-30T03:44:30Z",
          "primaryLanguage": {
            "primaryLanguage": "JavaScript"
      },
      {
          "name": "bar",
          "isFork": false,
          "isPrivate": true,
          "createdAt": "2019-04-25T01:26:31Z",
          "updatedAt": "2019-04-28T23:16:03Z",
          "primaryLanguage": {
            "primaryLanguage": "JavaScript"
      },
      {
          "name": "blogs",
          "isFork": false,
          "isPrivate": true,
          "createdAt": "2015-12-06T03:52:14Z",
          "updatedAt": "2016-02-27T05:17:52Z",
          "primaryLanguage": {
            "primaryLanguage": "CSS"
      }
    ]

我可以接受“不可能”作为答案,但这似乎是一个严重的设计缺陷,因为 JsonPath 可以轻松做到这一点。

您的过滤必须在 edges 数组上进行,但是,您评估的 属性 可以嵌套在对象的更深处。
所以你可以完美地拥有像 node.isPrivate == `true` 这样的条件,甚至更简单,因为 node.isPrivate 已经是一个布尔值,这个条件可以简单地读作 node.isPrivate.

鉴于查询:

data.repositoryOwner.repositories.edges[?node.isPrivate].node

我们最终得到期望 JSON:

[
  {
    "name": "foo",
    "isFork": false,
    "isPrivate": true,
    "createdAt": "2019-04-25T20:31:07Z",
    "updatedAt": "2019-04-30T03:44:30Z",
    "primaryLanguage": {
      "primaryLanguage": "JavaScript"
    }
  },
  {
    "name": "bar",
    "isFork": false,
    "isPrivate": true,
    "createdAt": "2019-04-25T01:26:31Z",
    "updatedAt": "2019-04-28T23:16:03Z",
    "primaryLanguage": {
      "primaryLanguage": "JavaScript"
    }
  },
  {
    "name": "blogs",
    "isFork": false,
    "isPrivate": true,
    "createdAt": "2015-12-06T03:52:14Z",
    "updatedAt": "2016-02-27T05:17:52Z",
    "primaryLanguage": {
      "primaryLanguage": "CSS"
    }
  }
]