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"
}
}
]
抱歉,我试过了,但就是无法让我的 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"
}
}
]