jsondepth
A small command-line tool to walk through the depth levels of a json objects
output json | jd <PATH>=. <DEPTH>=0

Summary
Motivation
Working with super deep json objects from the terminal is a pain, unless you use a good json parser.
jq is an awesome one, but doesn't handle object depths, afaik.
Here the idea is to walk through a json object as you would read a summary: level by level.
Installation
npm install -g jsondepth
How-to
real world example:
url='https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q1&format=json'
curl -s "$url" | jsondepth
logs the object with only the first-level keys and values:
{ entities: [Object], success: 1 }
for the sake of convenience and lazyness, jsondepth is aliased to jd
(which, purposedly make it look a bit like jq)
curl -s "$url" | jd
Specify a depth level
this is equivalent to the two previous one:
curl -s "$url" | jd 0
now let's go one-level deeper:
curl -s "$url" | jd 1
outputs:
{ entities: { Q1: [Object] }, success: 1 }

```sh
curl -s "$url" | jd 2
curl -s "$url" | jd 3
curl -s "$url" | jd 4
# etc
```
If you use [paths](#specify-a-path), you may wish to disable object wrapping: this can be done by passing `-1`. The advantage is that you are sure to get back a valid json object.
```sh
curl -s "$url" | jd -1
```
Specify a path
curl -s "$url" | jd entities.Q1.aliases.fi.1
curl -s "$url" | jd .entities.Q1.aliases.fi.1
curl -s "$url" | jd .entities.Q1.['a key with spaces']
Specify a depth and a path
if both a path and a depth are specified, path should come first, depth second
curl -s "$url" | jd entities.Q1.claims.P31.0 3
Access JS objects attributes
Native attributes
Arrays length
curl -s "$url" | jd entities.Q1.aliases.en.length
Special keys
_keys
apply Object.keys to the final object
curl -s "$url" | jd entities._keys
_values
apply _.values to an array
curl -s "$url" | jd entities._values
curl -s "$url" | jd entities._values.0.id
_map
map properties of an array
curl -s "$url" | jd entities._values._map.id
_first
echo '["foo", "bar"]' | jd ._first
_last
echo '["foo", "bar"]' | jd ._first
Format the output as valid JSON
Wrapped results like { entities: { Q1: [Object] }, success: 1 } are more readible but aren't valid JSON. And sometimes, for whatever reason, you want a valid JSON output; there in a option for that: --json|-j
curl -s "$url" | jd entities.Q1.aliases --json
You can even specify the output indentation level (Between 0 and 9. Default: 2):
curl -s "$url" | jd entities.Q1.aliases --json=0
curl -s "$url" | jd entities.Q1.aliases --json=4
Notice that it disables the depth option as it's responsible for the wrapping mechanism.
Parse newline delimited JSON
When the input is newline delimited JSON, filters are applied line by line.