Jq

From wikinotes
Revision as of 03:06, 29 August 2021 by Will (talk | contribs)

parse json on the commandline.

TODO:

the official docs are very good, but syntax could be documented consistently with other languages. (ex: datatypes etc)

Documentation

official docs https://stedolan.github.io/jq/manual/
basic filters docs https://stedolan.github.io/jq/manual/#Basicfilters
homepage https://stedolan.github.io/jq/

Usage

Basics

# print w/ syntaxhighlighting
echo '{"one": 1, "two": {"a": "A"}}' | jq

# get key ["one"]
echo '{"one": 1, "two": {"a": "A"}}' | jq '.one'    # 1

# get nested-key ["two"]["a"]
echo '{"one": 1, "two": {"a": "A"}}' | jq '.two.a'  # "A"

# get list item at index 1
echo '["a", "b", "c"]' | jq '.[1]'                  # "b"

Filters

jq '.'        # obj
jq '.one'     # obj["one"]
jq '.one?'    # obj["one"] (but no error if not exist)
jq '.one.two' # obj["one"]["two"]
jq '.[1]'     # obj[1]
jq '.[5:10]'  # list-items 5-10
jq '.[] | select(.name == "foo")           # all dicts in list where name=="foo"
jq '.[].name | select(startswith("foo"))'  # all name keys from dicts that start with "foo"

Expressions

Selections within () are evaluated as expressions

Operators

Used in expressions

+
-
*
/
%

Transform

You can compose new objects from the input object.

jq '{"fullname": (.firstname + .lastname)}'

Comments

Neither json nor jq support comments.
It's hacky, but you could pre-process the object to strip them, however.

echo '{
  // syntax-highlight as javascript

  "local_path": "/home/you", // your home dir

  // a network path
  "netwk_path": "//10.1.0.5/music"
}' \
  | sed 's?//[^"]*$??'
  | jq '.one'