Any interest in implementing .[] in interactive mode?
Opened this issue · 1 comments
When viewing JSON in interactive mode, I'd love to be able to dig into arrays of objects by doing .[]
. For example, in regular processing mode, I can pass a filter to fx on a top level array of objects like the example below, and get back a list of emails. So using this command curl "https://jsonplaceholder.typicode.com/comments" | fx '.[].email'
will process JSON like this
[
{
"postId": 1,
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium"
},
{
"postId": 1,
"id": 2,
"name": "quo vero reiciendis velit similique earum",
"email": "Jayne_Kuhic@sydney.com",
"body": "est natus enim nihil est dolore omnis voluptatem numquam\net omnis occaecati quod ullam at\nvoluptatem error expedita pariatur\nnihil sint nostrum voluptatem reiciendis et"
}
]
into a result like this
[
"Eliseo@gardner.biz",
"Jayne_Kuhic@sydney.com"
]
But I can't achieve the same thing in interactive mode. If I try typing .[].email
, as soon as I type the second dot, it clears my prompt and refuses to dig into the array. Doing .[0].email
works but only gives the first email.
Would this be a PR that you would support? I'm not familiar enough with the codebase to make this change myself yet, but if this is a change you would allow, I could try to start familiarizing myself to work through opening a PR.
Also if so, are there contribution docs anywhere? I couldn't find them. Thanks!
Yes, this is due to the fact what path is not a freeform JavaScript expression. It's a path of a cursor in JSON.
I have an idea to add full support arbitrary JS expressions in future as well.
One think I need to figure out, how to do argument splitting. Now fx relays on shell args splitting:
fx '.[].foo' func 'x => x.length'
How this string will be represented in a single string? Same with quotes? But this is ugly solution. With |
?
.[].foo | func | x => x.length