Sorry, I tried but simply cannot get my JMESPath filtering works to filter Github GraphQL for private repos.
Here is the Github GraphQL result I want to filter:
{
"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"
}
}
}
]
}
}
}
}
I've tried
data.repositoryOwner.repositories.edges.node[?isPrivate==`true`]
data.repositoryOwner.repositories.edges[].node[?isPrivate==`true`]
data.repositoryOwner.repositories.edges[].[node[?isPrivate==`true`]]
But none of them give me the list I want, as every single example from https://jmespath.org/tutorial.html is about filtering on array elements, whereas mine above is not.
Similar situation, for
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}"
How to further filter above on payload.action=='created'
(in place without using pipes)?
UPDATE2:
The answer is,
[?type=='IssueCommentEvent' && payload.action=='created'].payload.{Title: issue.title, URL: issue.url, User: issue.user.login, Event: action}
and we'll get:
[
{
"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"
},
. . .
]
Please help.
UPDATE:
I asked, "as every single example from https://jmespath.org/tutorial.html is about filtering on array elements, whereas mine above is not", and got:
In order to filter, you will need an array.
However, that's not what I'm expecting, as using the first one as the example, I'm expecting the filtered to be a JSON array:
[
{
"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"
}
]
I can accept "no way" as the answer, but that seems to be a serious design flaw, as JsonPath can easily do that.
Your filtering have to happen on the edges
array, still, the property you evaluate can be nested deeper in the object.
So you can perfectly have a condition like node.isPrivate == `true`
, or even simpler, since node.isPrivate
is already a boolean, a condition that would simply read node.isPrivate
.
Given the query:
data.repositoryOwner.repositories.edges[?node.isPrivate].node
We end up with the expect 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"
}
}
]