@remy/node-jq v1.1.7
Installation
npm install node-jq --saveUsage
jq example
Usually in your CLI with jq you would run:
jq ".abilities[].moves" bulbasaur.jsonand you would get
{
"name": "heartgold-soulsilver",
"power": "10"
}
{
"name": "platinum",
"power": "50"
}
{
"name": "diamond-pearl",
"power": "99"
}node-jq equivalent
With node-jq you could run it programmatically and interact with the output as a JavaScript Object:
const jq = require('node-jq')
const filter = '.abilities[].moves'
const jsonPath = '/path/to/bulbasaur.json'
const options = {}
jq.run(filter, jsonPath, options)
.then((output) => {
console.log(output)
/*
{
"name": "heartgold-soulsilver",
"power": "10"
},
{
"name": "platinum",
"power": "50"
},
{
"name": "diamond-pearl",
"power": "99"
}
*/
})
.catch((err) => {
console.error(err)
// Something went wrong...
})Options
input
| Description | Type | Values | Default |
|---|---|---|---|
| Type of input | string | 'file', 'json', 'string' | 'file' |
input: 'file'
Run the jq query against a JSON file.
jq.run('.', '/path/to/file.json').then(console.log)
// {
// "foo": "bar"
// }input: 'file'
Run jq query against multiple JSON files.
jq.run('.', ['/path/to/file.json','path/to/other_file.json']).then(console.log)
// {
// "foo": "bar"
// }
// {
// "otherFoo": "andBar"
// }input: 'json'
Run the jq query against an Object.
jq.run('.', { foo: 'bar' }, { input: 'json' }).then(console.log)
// {
// "foo": "bar"
// }input: 'string'
Run the jq query against a String.
jq.run('.', '{ foo: "bar" }', { input: 'string' }).then(console.log)
// {
// "foo": "bar"
// }output
| Description | Values | Default |
|---|---|---|
| Type of output | 'pretty', 'json', 'compact', 'string' | 'pretty' |
output: 'pretty'
Return the output as a String.
jq.run('.', '/path/to/file.json', { output: 'string' }).then(console.log)
// {
// "foo": "bar"
// }output: 'json'
Return the output as an Object.
jq.run('.', '/path/to/file.json', { output: 'json' }).then(console.log)
// { foo: 'bar' }output: 'compact'|'string'
Return the output as a String.
jq.run('.', '/path/to/file.json', { output: 'compact' }).then(console.log)
// {"foo":"bar"}
jq.run('.', '/path/to/file.json', { output: 'string' }).then(console.log)
// {"foo":"bar"}slurp
| Description | Values | Default |
|---|---|---|
| Read input stream into array | true, false | false |
slurp: true
Read input stream into array.
jq.run('.', ['/path/to/file.json','/path/to/other_file.json'], { output: 'json', slurp: true }).then(console.log)
// [
// {
// "foo": "bar"
// },
// {
// "otherFoo": "andBar"
// }
// ]sort
| Description | Values | Default |
|---|---|---|
| Sort object keys in alphabetical order | true, false | false |
sort: true
Sorts object keys alphabetically.
jq.run('.', ['/path/to/file.json'], { output: 'json', sort: true }).then(console.log)
// {
// "a": 2,
// "b": 1
// },Projects using node-jq
- atom-jq: an Atom package for manipulating JSON
- json-splora: an Electron implementation for manipulating JSON
Why?
Why would you want to manipulate JavaScript Objects with jq syntax in a node app, when there are tools like lodash?
The idea was to port jq in node to be able to run it as-is. node-jq doesn't try to replace Object filters, maps, or transformations.
Our primary goal was to make jq syntax available in Atom with atom-jq.
Other than that, jq is an interesting CLI tool to quickly parse the response of an API, such as:
curl 'https://jsonplaceholder.typicode.com/comments' | jq '.[].postId'There are also people dealing with complex responses:
- ilya-sher.org/2016/05/11/most-jq-you-will-ever-need
- cloudadvantage.com.au/new-aws-command-line-tool-and-jq
Want to learn jq?
Seems hard to learn, but it really isn't.
jq is like sed for JSON. Slice, filter, map and transform structured data in a simple and powerful way.
Take a look at this great introduction or a jq lesson.
You can check out the official manual and fiddle around in the online playground jqplay.org.