This is an implementation of jq command written in Go language. You can also embed gojq as a library to your Go products.
$ echo '{"foo": 128}' | gojq '.foo'
128
$ echo '{"a": {"b": 42}}' | gojq '.a.b'
42
$ echo '{"id": "sample", "10": {"b": 42}}' | gojq '{(.id): .["10"].b}'
{
"sample": 42
}
$ echo '[{"id":1},{"id":2},{"id":3}]' | gojq '.[] | .id'
1
2
3
$ echo '{"a":1,"b":2}' | gojq '.a += 1 | .b *= 2'
{
"a": 2,
"b": 4
}
$ echo '{"a":1} [2] 3' | gojq '. as {$a} ?// [$a] ?// $a | $a'
1
2
3
$ echo '{"foo": 4722366482869645213696}' | gojq .foo
4722366482869645213696 # keeps the precision of large numbers
$ gojq -n 'def fact($n): if $n < 1 then 1 else $n * fact($n - 1) end; fact(50)'
30414093201713378043612608166064768844377641568960512000000000000 # arbitrary-precision integer calculation
Nice error messages.
$ echo '[1,2,3]' | gojq '.foo & .bar'
gojq: invalid query: .foo & .bar
.foo & .bar
^ unexpected token "&"
$ echo '{"foo": { bar: [] } }' | gojq '.'
gojq: invalid json: <stdin>
{"foo": { bar: [] } }
^ invalid character 'b' looking for beginning of object key string
brew install gojq
0install add gojq https://apps.0install.net/utils/gojq.xml
go install github.com/itchyny/gojq/cmd/gojq@latest
docker run -i --rm itchyny/gojq
docker run -i --rm ghcr.io/itchyny/gojq
keys_unsorted
function and --sort-keys
(-S
) option. I would implement when ordered map is implemented in the standard library of Go but I'm less motivated.floor
and round
, convert integers to floating-point numbers; only addition, subtraction, multiplication, modulo, and division operators (when divisible) keep the integer precision. To calculate floor division of integers without losing the precision, use def idivide($n): (. - . % $n) / $n;
. To round down floating-point numbers to integers, use def ifloor: floor | tostring | tonumber;
, but note that this function does not work with large floating-point numbers and also loses the precision of large integers.index
, rindex
, and indices
functions; "12345" | .[index("3"):]
results in "345"
(jq#1430, jq#1624). gojq supports string indexing; "abcde"[2]
(jq#1520). gojq fixes handling files with no newline characters at the end (jq#2374). gojq consistently truncates down floating-point number indices both in indexing ([0] | .[0.5]
results in 0
), and slicing ([0,1,2] | .[0.5:1.5]
results in [0]
). gojq parses unary operators with higher precedence than variable binding ([-1 as $x | 1,$x]
results in [1,-1]
not [-1,-1]
) (jq#3053). gojq fixes @base64d
to allow binary string as the decoded string (jq#1931). gojq improves time formatting and parsing; deals with %f
in strftime
and strptime
(jq#1409), parses timezone offsets with fromdate
and fromdateiso8601
(jq#1053), supports timezone name/offset with %Z
/%z
in strptime
(jq#929, jq#2195), and looks up correct timezone during daylight saving time on formatting with %Z
(jq#1912). gojq supports nanoseconds in date and time functions.get_jq_origin
, get_prog_origin
, get_search_list
(unstable, not listed in jq document), input_line_number
, $__loc__
(performance issue). gojq does not support some flags; --ascii-output, -a
(performance issue), --seq
(not used commonly), --sort-keys, -S
(sorts by default because map[string]any
does not keep the order), --unbuffered
(unbuffered by default). gojq does not parse JSON extensions supported by jq; NaN
, Infinity
, and [000]
. gojq normalizes floating-point numbers to fit to double-precision floating-point numbers. gojq does not support some regular expression metacharacters, backreferences, look-around assertions, and some flags (regular expression engine differences). gojq does not support BOM (encoding/json
does not support this). gojq disallows using keywords for function names (def true: .; true
is a confusing query), and module name prefixes in function declarations (using module prefixes like def m::f: .;
is undocumented).--yaml-input
) while jq does not. gojq also supports YAML output (--yaml-output
). gojq supports @urid
format string (jq#798, jq#2261).The gojq command automatically disables coloring output when the output is not a tty.
To force coloring output, specify --color-output
(-C
) option.
When NO_COLOR
environment variable is present or --monochrome-output
(-M
) option is specified, gojq disables coloring output.
Use GOJQ_COLORS
environment variable to configure individual colors.
The variable is a colon-separated list of ANSI escape sequences of null
, false
, true
, numbers, strings, object keys, arrays, and objects.
The default configuration is 90:33:33:36:32:34;1
.
You can use the gojq parser and interpreter from your Go products.
package main
import (
"fmt"
"log"
"github.com/itchyny/gojq"
)
func main() {
query, err := gojq.Parse(".foo | ..")
if err != nil {
log.Fatalln(err)
}
input := map[string]any{"foo": []any{1, 2, 3}}
iter := query.Run(input) // or query.RunWithContext
for {
v, ok := iter.Next()
if !ok {
break
}
if err, ok := v.(error); ok {
if err, ok := err.(*gojq.HaltError); ok && err.Value() == nil {
break
}
log.Fatalln(err)
}
fmt.Printf("%#v\n", v)
}
}
gojq.Parse(string) (*Query, error)
to get the query from a string.
gojq.ParseError
to get the error position and token of the parsing error.query.Run
or query.RunWithContext
gojq.Compile
and then code.Run
or code.RunWithContext
. You can reuse the *Code
against multiple inputs to avoid compilation of the same query. But for arguments of code.Run
, do not give values sharing same data between multiple calls.[]any
for an array and map[string]any
for a map (just like decoded to an any
using the encoding/json package). You can't use []int
or map[string]string
, for example. If you want to query your custom struct, marshal to JSON, unmarshal to any
and use it as the query input.iter.Next() (any, bool)
. The iterator can emit an error so make sure to handle it. The method returns true
with results, and false
when the iterator terminates.
(any, error)
because the iterator may emit multiple errors. The jq
and gojq
commands stop the iteration on the first error, but the library user can choose to stop the iteration on errors, or to continue until it terminates.gojq.HaltError
, which is emitted by halt
and halt_error
functions, although these functions are rarely used.
The error implements gojq.ValueError
, and if the error value is nil
, stop the iteration without handling the error.
Technically speaking, we can fix the iterator to terminate on the halting error, but it does not terminate at the moment.
The halt
function in jq not only stops the iteration, but also terminates the command execution, even if there are still input values.
So, gojq leaves it up to the library user how to handle the halting error.repeat(0)
and range(infinite)
. It may stuck with no output value; def f: f; f
. Use RunWithContext
when you want to limit the execution time.gojq.Compile
allows to configure the following compiler options.
gojq.WithModuleLoader
allows to load modules. By default, the module feature is disabled. If you want to load modules from the file system, use gojq.NewModuleLoader
.gojq.WithEnvironLoader
allows to configure the environment variables referenced by env
and $ENV
. By default, OS environment variables are not accessible due to security reasons. You can use gojq.WithEnvironLoader(os.Environ)
if you want.gojq.WithVariables
allows to configure the variables which can be used in the query. Pass the values of the variables to code.Run
in the same order.gojq.WithFunction
allows to add a custom internal function. An internal function can return a single value (which can be an error) each invocation. To add a jq function (which may include a comma operator to emit multiple values, empty
function, accept a filter for its argument, or call another built-in function), use LoadInitModules
of the module loader.gojq.WithIterFunction
allows to add a custom iterator function. An iterator function returns an iterator to emit multiple values. You cannot define both iterator and non-iterator functions of the same name (with possibly different arities). You can use gojq.NewIter
to convert values or an error to a gojq.Iter
.gojq.WithInputIter
allows to use input
and inputs
functions. By default, these functions are disabled.Report bug at Issues・itchyny/gojq - GitHub.
itchyny (https://github.com/itchyny)
This software is released under the MIT License, see LICENSE.