jsondepth
v2.0.5
Published
A small command-line tool to parse JSON and log it with the desired object depth
Downloads
494
Maintainers
Readme
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 }
curl -s "$url" | jd 2
curl -s "$url" | jd 3
curl -s "$url" | jd 4
# etc
curl -s "$url" | jd -1
Specify a path
curl -s "$url" | jd entities.Q1.aliases.fi.1
# or to mimick jq syntax
curl -s "$url" | jd .entities.Q1.aliases.fi.1
# or with keys with spaces
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
# => 5
Special keys
_keys
apply Object.keys
to the final object
curl -s "$url" | jd entities._keys
# => ['Q1']
_values
apply _.values
to an array
curl -s "$url" | jd entities._values
# => [{ id: 'Q1', etc...}]
curl -s "$url" | jd entities._values.0.id
# => 'Q1'
_map
map properties of an array
curl -s "$url" | jd entities._values._map.id
# => ['Q1']
_first
echo '["foo", "bar"]' | jd ._first
# => foo
_last
echo '["foo", "bar"]' | jd ._first
# => bar
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
Add the --line
option to parse the stdin line by line
curl https://some.ndjson.dump | jd --line .key
There is a tolerance for JSON lines ending by a comma, and any line that isn't starting by a {
or a }
is ignored.