项目作者: maxlath

项目描述 :
a small command-line tool to walk through the depth levels of a JSON objects
高级语言: JavaScript
项目地址: git://github.com/maxlath/jsondepth.git
创建时间: 2016-04-28T12:06:20Z
项目社区:https://github.com/maxlath/jsondepth

开源协议:

下载


jsondepth

A small command-line tool to walk through the depth levels of a json objects

output json | jd <PATH>=. <DEPTH>=0

screenshot

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

  1. npm install -g jsondepth

How-to

real world example:

  1. url='https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q1&format=json'
  2. curl -s "$url" | jsondepth

logs the object with only the first-level keys and values:

  1. { 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)

  1. curl -s "$url" | jd

Specify a depth level

this is equivalent to the two previous one:

  1. curl -s "$url" | jd 0

now let’s go one-level deeper:

  1. curl -s "$url" | jd 1

outputs:

  1. { entities: { Q1: [Object] }, success: 1 }

we need to go deeper

  1. curl -s "$url" | jd 2
  2. curl -s "$url" | jd 3
  3. curl -s "$url" | jd 4
  4. # etc



If you use paths, 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.

  1. curl -s "$url" | jd -1

Specify a path

  1. curl -s "$url" | jd entities.Q1.aliases.fi.1
  2. # or to mimick jq syntax
  3. curl -s "$url" | jd .entities.Q1.aliases.fi.1
  4. # or with keys with spaces
  5. 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

  1. curl -s "$url" | jd entities.Q1.claims.P31.0 3

Access JS objects attributes

Native attributes

Arrays length
  1. curl -s "$url" | jd entities.Q1.aliases.en.length
  2. # => 5

Special keys

_keys

apply Object.keys to the final object

  1. curl -s "$url" | jd entities._keys
  2. # => ['Q1']
_values

apply _.values to an array

  1. curl -s "$url" | jd entities._values
  2. # => [{ id: 'Q1', etc...}]
  3. curl -s "$url" | jd entities._values.0.id
  4. # => 'Q1'
_map

map properties of an array

  1. curl -s "$url" | jd entities._values._map.id
  2. # => ['Q1']
_first
  1. echo '["foo", "bar"]' | jd ._first
  2. # => foo
_last
  1. echo '["foo", "bar"]' | jd ._first
  2. # => 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

  1. curl -s "$url" | jd entities.Q1.aliases --json

You can even specify the output indentation level (Between 0 and 9. Default: 2):

  1. curl -s "$url" | jd entities.Q1.aliases --json=0
  2. 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

  1. 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.

See also