book
  • README
  • cheatsheet
    • bash
      • builtin
      • syntactic sugar
      • cmd
      • havefun
    • text-processing
      • awk
      • sed
      • html
      • json
      • regex
      • unicode
    • osx
    • curl
    • tricky
    • widget
    • proxy
    • colors
    • math
    • media
    • ssl
      • keystore
      • verification
      • server
      • client
      • tricky
    • windows
      • powershell
      • choco
      • wsl
      • wt
      • shortcut
      • clsid
      • env
      • shell:folder
  • vim
    • nvim
    • install
    • color
    • plugins
      • usage
      • other plugins
      • deprecated
    • tricky
    • viml
    • windows
    • troubleshooting
  • devops
    • admin tools
    • ssh
    • git
      • config
      • alias
      • submodule
      • eol
      • example
      • gerrit
        • gerrit API
      • github
      • troubleshooting
      • tricky
      • statistics
    • pre-commit
    • release-tools
    • tmux
      • cheatsheet
    • ansible
    • vault
    • artifactory
      • api
      • cli
      • aql
      • nginx cert
    • klocwork
      • kwadmin
      • kwserver
      • api
      • q&a
    • elk
    • mongodb
    • android
    • mobile
  • jenkins
    • config
      • windows
    • appearance
    • troubleshooting
    • jenkinsfile
      • utility
      • parallel
      • build
      • envvar
      • properties
      • trigger
      • node
    • script
      • job
      • build
      • stage
      • agent
      • security & authorization
      • exception
      • monitor
      • tricky
    • api
      • blueocean
    • cli
    • plugins
      • kubernetes
      • docker
      • shared-libs
      • lockable-resource
      • ansicolor
      • badge
      • groovy-postbuild
      • simple-theme
      • customizable-header
      • artifactory
      • jira-steps
      • job-dsl
      • build-timeline
      • crumbIssuer
      • coverage
      • uno-choice
      • tricky
  • virtualization
    • kubernetes
      • init
        • kubespray
        • kubeadm
          • environment
          • crio v1.30.4
          • docker v1.15.3
          • HA
        • addons
        • etcd
      • kubectl
        • pod
        • deploy
        • replicasets
        • namespace
        • secrets
      • node
      • certificates
      • events
      • kubeconfig
      • kubelet
      • troubleshooting
      • cheatsheet
      • auth
      • api
      • tools
        • monitor
        • helm
        • network
        • minikube
    • docker
      • run & exec
      • voume
      • remove
      • show info
      • dockerfile
      • dockerd
      • tricky
      • troubleshooting
      • windows
    • crio
    • podman
  • ai
    • prompt
  • osx
    • apps
      • init
      • brew
    • defaults
    • system
    • network
    • script
    • tricky
  • linux
    • devenv
    • util
      • time & date
      • output formatting
      • params
      • tricky
    • nutshell
    • disk
    • network
    • troubleshooting
    • system
      • apt/yum/snap
      • authorization
      • apps
      • x11
    • ubuntu
      • systemctl
      • x
    • rpi
  • programming
    • groovy
    • python
      • config
      • basic
      • list
      • pip
      • q&a
    • others
    • archive
      • angular
      • maven
      • mysql
        • installation
        • logs
      • ruby
        • rubyInstallationQ&A
  • tools
    • fonts
    • html & css
    • Jira & Confluence
    • node & npm
      • gitbook
      • hexo
      • github.page
      • code themes
    • app
      • microsoft office
      • vscode
      • virtualbox
      • iterm2
      • browser
      • skype
      • teamviewer
      • others
  • quotes
  • english
Powered by GitBook
On this page
  • basic
  • join
  • split
  • replacing
  • builtin operators
  • tricky

Was this helpful?

  1. cheatsheet
  2. text-processing

json

PrevioushtmlNextregex

Last updated 4 months ago

Was this helpful?

json online player:

jq online player:

reference:

basic

SYNTAX
DESCRIPTION

,

Filters separated by a comma will produce multiple independent outputs

?

Will ignores error if the type is unexpected

[]

Array construction

{}

Object construction

+

Concatenate or Add

-

Difference of sets or Substract

length

Size of selected element

⎮

Pipes are used to chain commands in a similar fashion than bash

DESCRIPTION
COMMAND

Display all keys

jq 'keys'

Adds + 1 to all items

jq 'map_values(.+1)'

Delete a key

jq 'del(.foo)'

Convert an object to array

to_entries ⎮ map([.key, .value])

[!NOTE|label:references:]

  • select by type: with type been arrays, objects, iterables, booleans, numbers, normals, finites, strings, nulls, values, scalars

DESCRIPTION
COMMAND

All

jq .[]

First

jq '.[0]'

Range

jq '.[2:4]'

First 3

jq '.[:3]'

Last 2

jq '.[-2:]'

Before Last

jq '.[-2]'

split

jq '.[] ⎮ split("/")[1]'

Select array of int by value

jq 'map(select(. >= 2))'

Select array of objects by value

jq '.[] ⎮ select(.id == "second")'

Select by type

jq '.[] ⎮ numbers'

DESCRIPTION
COMMAND

Add + 1 to all items

jq 'map(.+1)'

Delete 2 items

jq 'del(.[1, 2])'

Concatenate arrays

jq 'add'

Flatten an array

jq 'flatten'

Create a range of numbers

jq '[range(2;4)]'

Display the type of each item

jq 'map(type)'

Sort an array of basic type

jq 'sort'

Sort an array of objects

jq 'sort_by(.foo)'

Group by a key - opposite to flatten

jq 'group_by(.foo)'

Minimun value of an array

jq 'min' See also min, max, min_by(path_exp), max_by(path_exp)

Remove duplicates

jq 'unique' or jq 'unique_by(.foo)' or jq 'unique_by(length)'

Reverse an array

jq 'reverse'

join

[!TIP] references:

$ echo '{ "some": "thing", "json": "like" }' |
       jq -r '[.some, .json] | join(":")'
thing:like
  • or

    $ echo '{ "some": "thing", "json": "like" }' |
           jq -r '[.some, .json] | "\(.[0]) \(.[1])"'
    thing like
  • or

    $ echo '{ "some": "thing", "json": "like" }' |
           jq -r '[.some, .json] | "\(.[0]): \(.[1])"'
    thing: like
  • or with reduce

    $ echo '{ "some": "thing", "json": "like" }' |
           jq -r '[.some, .json] | reduce .[1:][] as $i ("\(.[0])"; . + ",\($i)")'
    thing,like
  • $ echo '{ "k1": "v1", "k2": "v2", "k3": "v3", "k4": "v4" }' |
           jq -r '[.k1, .k2, .k3] | reduce .[1:][] as $i ("\(.[0])"; . + ",\($i)")'
    v1,v2,v3
  • $ echo '{ "users": [ { "first": "Stevie", "last": "Wonder" }, { "first": "Michael", "last": "Jackson" } ] }' |
           jq -r '.users[] | .first + " " + .last'
    Stevie Wonder
    Michael Jackson
  • or

    $ echo '{ "users": [ { "first": "Stevie", "last": "Wonder" }, { "first": "Michael", "last": "Jackson" } ] }' |
           jq -r '.users[] | .first + " " + (.last|tostring)'
  • or

    $ echo '{ "users": [ { "first": "Stevie", "last": "Wonder", "number": 1 }, { "first": "Michael", "last": "Jackson", "number": 2 } ] }' |
           jq -r '.users[] | .first + " " + (.number|tostring)'
    Stevie 1
    Michael 2

join with getOrDefault

[!TIP|label:references:]

  • orignal wihtout getOrDefault

    $ echo '[
            {"id": "1", "version": "v1"},
            {"id": "2", "version": "v2"},
            {"id": "3", "version": null}
            ]
           ' |
      jq -r '.[] | .id + " -> " + .version'
    1 -> v1
    2 -> v2
    3 ->
  • using //

    [!TIP|label:references:]

    $ echo '[
              {"id": "1", "version": "v1"},
              {"id": "2", "version": "v2"},
              {"id": "3", "version": null}
            ]' |
      jq -r '.[] | .id + " -> " + ( .version // "UNKNOWN" )'
    1 -> v1
    2 -> v2
    3 -> UNKNOWN
  • using if then else end

    [!TIP|label:references:]

    $ echo '[
              { "id": "1", "version": "v1" } ,
              { "id": "2", "version": "v2" } ,
              { "id": "3", "version": null } ,
              { "id": "4", "version": ""   }
            ]' |
      jq -r '.[] |
             .id + " -> " +
             if (.version != null and .version != "") then .version
             else "UNKNOWN"
             end'
    
    # or
    $ echo '[
              { "id": "1", "version": "v1" } ,
              { "id": "2", "version": "v2" } ,
              { "id": "3", "version": null } ,
              { "id": "4", "version": ""   }
            ]' |
      jq -r '.[] |
             .id + " -> " +
             if .version == null or .version == "" then "UNKNOWN"
             else .version
             end'
    1 -> v1
    2 -> v2
    3 -> UNKNOWN
    4 -> UNKNOWN
    
    # or using `empty`
    #                           `empty` will not output anything for id==3 and id==4
    #                                                     v
    $ echo '[
              { "id": "1", "version": "v1" } ,
              { "id": "2", "version": "v2" } ,
              { "id": "3", "version": null } ,
              { "id": "4", "version": ""   }
            ]
           ' |
      jq -r '.[] |
             .id + " -> " +
             if .version == null or .version == "" then empty
             else .version
             end
            '
    1 -> v1
    2 -> v2
    // `empty` will not output anything for id==3 and id==4
    
    # or including non-exists key
    $ echo '[
              { "id": "1", "version": "v1" } ,
              { "id": "2", "version": "v2" } ,
              { "id": "3", "version": null } ,
              { "id": "4", "version": ""   } ,
              { "id": "5"                  }
            ]
           ' |
      jq -r '.[] |
             .id + " -> " +
             if ( has("version") and .version != null and .version != "" ) then
               .version
             else "UNKNOWN"
             end
            '
    1 -> v1
    2 -> v2
    3 -> UNKNOWN
    4 -> UNKNOWN
    5 -> UNKNOWN

split

[!TIP] references:

    • Splits an input string on the separator argument.

    • jq 'split(", ")'
      Input "a, b,c,d, e, "
      Output  ["a","b,c,d","e",""]
$ echo '[{"uri" : "/1" }, {"uri" : "/2"}, {"uri" : "/3"}]' |
        jq -r '.[].uri'
/1
/2
/3

$ echo '[{"uri" : "/1" }, {"uri" : "/2"}, {"uri" : "/3"}]' |
        jq -r '.[].uri | split("/")[1]'
1
2
3
  • $ echo '[{"uri" : "/1" }, {"uri" : "/2"}, {"uri" : "/3"}]' |
            jq '.[].uri | split("/")[]'
    ""
    "1"
    ""
    "2"
    ""
    "3"
    
    $ echo '[{"uri" : "/1" }, {"uri" : "/2"}, {"uri" : "/3"}]' |
            jq -r '.[].uri | split("/")'
    [
      "",
      "1"
    ]
    [
      "",
      "2"
    ]
    [
      "",
      "3"
    ]

replacing

[!TIP|label:references:]

    • Emit the string obtained by replacing the first match of regex in the input string with tostring, after interpolation. tostring should be a jq string, and may contain references to named captures. The named captures are, in effect, presented as a JSON object (as constructed by capture) to tostring, so a reference to a captured variable named "x" would take the form: "(.x)".

$ echo '[{"uri" : "/1" }, {"uri" : "/2"}, {"uri" : "/3"}]' |
        jq -r '.[].uri'
/1
/2
/3

$ echo '[{"uri" : "/1" }, {"uri" : "/2"}, {"uri" : "/3"}]' |
        jq -r '.[].uri | sub("/"; "")'
1
2
3

builtin operators

[!NOTE|label:references:]

debug

  • without debug

    $ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "SECOND", "val": 3}]'''  |
           jq '.[] | select( .val == (2, 3) )'
  • with debug:

    $ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "SECOND", "val": 3}]'''  |
           jq '.[] | select( .val == (2, 3) | debug )'
    ["DEBUG:",false]
    ["DEBUG:",false]
    ["DEBUG:",true]
    {
      "id": "second",
      "val": 2
    }
    ["DEBUG:",false]
    ["DEBUG:",false]
    ["DEBUG:",true]
    {
      "id": "SECOND",
      "val": 3
    }

select

[!NOTE|label:refrences:]

  • to_entries[]
    | select(.value | . == null or . == "")
    | if .value == "" then .value |= "\"\(.)\"" else . end
    | "\(.key): \(.value)"
$ echo '[1,5,3,0,7]' |
       jq 'map(select(. >= 2))'
[
  5,
  3,
  7
]
  • or

    $ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2}]''' |
           jq '.[] | select(.id == "second")'
    {
      "id": "second",
      "val": 2
    }
  • [!NOTE|label:references:]

    // sample.json
    [
      {
        "attributes": {
          "created": "2021-10-18T12:02:39+00:00",
          "enabled": true,
          "expires": null,
          "notBefore": null
        },
        "contentType": null,
        "id": "https://kjkljk./secrets/-/1",
        "managed": null,
        "name": "pw",
        "tags": {}
      },
      {
        "attributes": {
          "created": "2021-10-18T12:06:16+00:00",
          "enabled": false,
          "expires": null,
          "notBefore": null
        },
        "contentType": "",
        "id": "https://kjklj./secrets/-/2",
        "managed": null,
        "name": "pw",
        "tags": {}
      }
    ]
    # get [{.id}] format
    $ cat sample.json |
          jq -r 'map(select(any(.attributes; .enabled)) | {id})'
    [
      {
        "id": "https://kjkljk./secrets/-/1"
      }
    ]
    
    # get [.id] format
    $ cat sample.json |
          jq -r 'map(select(any(.attributes; .enabled)) | .id)'
    [
      "https://kjkljk./secrets/-/1"
    ]
    
    # get .id format ( without `map()` )
    $ cat sample.json |
          jq -r '.[] | select(any(.attributes; .enabled)) | .id'
    https://kjkljk./secrets/-/1
    
    # re-format
    $ cat sample.json |
          jq -r '{"ids": .[] | select(any(.attributes; .enabled)) | .id}'
    {
      "ids": "https://kjkljk./secrets/-/1"
    }

contains

[!NOTE|label:reference:]

$ echo '[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "second-one", "val": 3}]' |
       jq '.[] | select( .id | contains("second") )'
{
  "id": "second",
  "val": 2
}
{
  "id": "second-one",
  "val": 3
}
  • $ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "second.one", "val": 3}]'''  |
           jq '.[] | select( .id | test("sec*") )'
    {
      "id": "second",
      "val": 2
    }
    {
      "id": "second.one",
      "val": 3
    }
$ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "second-one", "val": 3}]'''  |
       jq '.[] | select( [.val] | inside([2,3]) )'
{
  "id": "second",
  "val": 2
}
{
  "id": "second-one",
  "val": 3
}
  • $ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "SECOND", "val": 3}]'''  |
           jq '.[] | select( .val == (2, 3) )'
    {
      "id": "second",
      "val": 2
    }
    {
      "id": "SECOND",
      "val": 3
    }
$ echo '''[{"id": "first", "val": 1}, {"id": "second", "val": 2},  {"id": "SECOND", "val": 3}]'''  |
       jq '.[] | select(.id | ascii_upcase == "SECOND")'
{
  "id": "second",
  "val": 2
}
{
  "id": "SECOND",
  "val": 3
}

[!NOTE] references:

# original
$ echo '{ "name" : "marslo" }' | jq -r
{
  "name": "marslo"
}

# `to_entries[]`
$ echo '{ "name" : "marslo" }' | jq -r 'to_entries[]'
{
  "key": "name",
  "value": "marslo"
}

# or `to_entries`
$ echo '{"a": 1, "b": 2}' | jq -r to_entries
[
  {
    "key": "a",
    "value": 1
  },
  {
    "key": "b",
    "value": 2
  }
]
  • example to get key and value

    $ echo '{ "some": "thing", "json": "like" }' |
           jq -r 'to_entries[] | "\(.key)\t\(.value)"'
    some    thing
    json    like
    • or output format to @csv

      $ echo '{ "some": "thing", "json": "like" }' |
             jq -r '[.some, .json] | @csv'
      "thing","like"
    • or output format to @tsv

      $ echo '{ "some": "thing", "json": "like" }' |
             jq -r '[.some, .json] | @tsv'
      thing like
  • to_entries and select

    # orignal
    $ echo '{ "name/" : "marslo", "age/" : "18", "citizenship" : "china" }' | jq -r
    {
      "name/": "marslo",                 # wants value if key ends with '/'
      "age/": "18",                      # wants value if key ends with '/'
      "citizenship": "china"
    }
    
    # select
    $ echo '{ "name/" : "marslo", "age/" : "18", "citizenship" : "china" }' |
           jq -r 'to_entries[] | select(.key|endswith("/")) '
    {
      "key": "name/",
      "value": "marslo"
    }
    {
      "key": "age/",
      "value": "18"
    }
    
    # get `.value` after selected
    $ echo '{ "name/" : "marslo", "age/" : "18", "citizenship" : "china" }' |
           jq -r 'to_entries[] | select(.key|endswith("/")) | .value'
    marslo
    18
// sample.json
[
  {
    "name": "x",
    "hobby": [                     // < has hobby
      "baseball",
      "baseketball"
     ]
  },
  {
    "name": "y"                    // < no hobby
  }
]
# to_entries[] directly will cause issue
$ cat sample.json |
      jq '.[] | .name as $n | .hobby | to_entries[] | [$n, .value]'
[
  "x",
  "baseball"
]
[
  "x",
  "baseketball"
]
jq: error (at <stdin>:12): null (null) has no keys

# try to_entries[]
#                                      try
#                                       v
$ cat sample.json |
      jq '.[] | .name as $n | .hobby | try to_entries[] | [$n, .value]'
[
  "x",
  "baseball"
]
[
  "x",
  "baseketball"
]

from_entries

$ echo '[{"key":"a", "value":1}, {"key":"b", "value":2}]' |
       jq -r from_entries
{
  "a": 1,
  "b": 2
}

with_entries

[!NOTE|label:references:]

$ echo '{"a": 1, "b": 2}' |
       jq 'with_entries(.key |= "KEY_" + .)'
{
  "KEY_a": 1,
  "KEY_b": 2
}
  • to get particular branch permissions from Gerrit

    # with_entries
    $ curl -fsSL https://gerrit.domain.com/a/projects/$(printf %s "path/to/sandbox" | jq -sRr @uri)/access |
           tail -n+2 |
           jq -r '.local | with_entries( if(.key | test("^.+sandbox/marslo.+$")) then ( {key: .key, value: .value } ) else empty end )'
    
    # try to_entries[]
    $ curl -fsSL https://gerrit.domain.com/a/projects/$(printf %s "path/to/sandbox" | jq -sRr @uri)/access |
           tail -n+2 |
           jq -r '.local | try to_entries[] | select(.key | test("^.+sandbox/marslo.+$")) | .value'

as

[!NOTE|label:references]

$ echo '{ "name/" : "marslo", "age/" : "18", "citizenship" : "china" }' |
       jq -r '. as $o | keys_unsorted[] | select(endswith("/")) | $o[.]'
marslo
18

tricky

space in the key

$ echo '{ "k1 name": "v1", "k2 name": "v2", "k3": "v3", "k4": "v4" }' |
       jq -r '."k1 name"'
v1

[!TIP|label:references:]

$ printf %s 'input text' | jq -sRr @uri
input%20text

$ printf %s 'input=(text)' | jq -sRr @uri
input%3D%28text%29

$ printf %s '(=)&' | jq -sRr @uri
%28%3D%29%26
$ echo [
  "foo1:         xxxxxx",
  "foo2:    xxxxxx",
  "foo3:     xxxxxx",
  "foo4:         xxxxxx",
  "foo5:   xxxxxx",
  "foo6:       xxxxxx"
] | jq -r 'map(capture("^(?<key>.*):\\s*(?<value>.*)$")) | from_entries'
{
  "foo1": "xxxxxx",
  "foo2": "xxxxxx",
  "foo3": "xxxxxx",
  "foo4": "xxxxxx",
  "foo5": "xxxxxx",
  "foo6": "xxxxxx"
}

[!NOTE|label:references:]

    • map( ... ) ≡ [ .[] | ... ], which map( . ) ≡ [ .[] | . ] ≡ [ .[] ]

    • for array: map( . ) ≡ [ .[0], .[1], ... ] ≡ .

    • for object: map( . ) ≡ [ .["key1"], .["key2"], ... ]

with .first and .last

by using

Online JSON Formatter & Validator
https://jqplay.org
jq manual (development version)
Parsing JSON with jq
olih/jq-cheetsheet.md
Use jq to filter objects list with regex
jq: Cannot iterate over number / string and number cannot be added
Guide to Linux jq Command for JSON Processing
Reshaping JSON with jq
* jq cheat sheet
Replacing a missing or null property
Replacing substrings in a string
syntax for jq
dealing with json objects
slicing and filtering
mapping and transforming
to output multiple values on a single line
join multiple values
or
or
Get or default function in JQ?
Filter empty and/or null values with jq
Get or default function in JQ?
remove a substring from a string
split(str)
example
try online
Replacing substrings in a string
sub(regex; tostring), sub(regex; string; flags)
jq manual - Builtin operators and functions
imarslo: example on jenkins api analysis
imarslo: example on gerrit api analysis
jq tips : remove emtpy line
Remove all null values
Filter empty and/or null values with jq
select with any
any(.attributes; .enabled == true) == any(.attributes; .enabled) == .attributes.enabled == true == .attributes.enabled
try online
imarslo: example on artifactory api analysis
imarslo: example on list Error pods in kuberetnes
test
inside
or
toUpperCase : ascii_upcase
to_entries
jq: filter input based on if key ends with specified string
try to_entries
JQ: Filtering for keys
jq: filter input based on if key ends with specified string
get urlencode
Percent-encoding
string to json
map
semantics of map on a sequence of objects in jq
basic
syntax for jq
dealing with json objects
slicing and filtering
mapping and transforming
join
join with getOrDefault
split
replacing
builtin operators
debug
select
contains
inside
toUpperCase : ascii_upcase
to_entries
try to_entries
from_entries
with_entries
as
tricky
space in the key
get urlencode
string to json
map