A high performance Golang implementation of the incredibly useful jq command line tool.
Rather than marshalling json elements into go instances, jq opts to manipulate the json elements as raw []byte. This is especially useful for apps that need to handle dynamic json data.
Using jq consists of creation an Op
and then calling Apply
on the Op
to transform one []byte into the
desired []byte. Ops may be chained together to form a transformation chain similar to how the command line jq works.
go get github.com/savaki/jq
package main
import (
"fmt"
"github.com/savaki/jq"
)
func main() {
op, _ := jq.Parse(".hello") // create an Op
data := []byte(`{"hello":"world"}`) // sample input
value, _ := op.Apply(data) // value == '"world"'
fmt.Println(string(value))
}
The initial goal is to support all the selectors the original jq command line supports.
syntax | meaning |
---|---|
. | unchanged input |
.foo | value at key |
.foo.bar | value at nested key |
.[0] | value at specified element of array |
.[0:1] | array of specified elements of array, inclusive |
.foo.[0] | nested value |
{
"string": "a",
"number": 1.23,
"simple": ["a", "b", "c"],
"mixed": [
"a",
1,
{"hello":"world"}
],
"object": {
"first": "joe",
"array": [1,2,3]
}
}
syntax | value |
---|---|
.string | "a" |
.number | 1.23 |
.simple | ["a", "b", "c"] |
.simple.[0] | "a" |
.simple.[0:1] | ["a","b"] |
.mixed.[1] | 1 |
.object.first | "joe" |
.object.array.[2] | 3 |
BenchmarkAny-8 20000000 80.8 ns/op 0 B/op 0 allocs/op
BenchmarkArray-8 20000000 108 ns/op 0 B/op 0 allocs/op
BenchmarkFindIndex-8 10000000 125 ns/op 0 B/op 0 allocs/op
BenchmarkFindKey-8 10000000 125 ns/op 0 B/op 0 allocs/op
BenchmarkFindRange-8 10000000 186 ns/op 16 B/op 1 allocs/op
BenchmarkNumber-8 50000000 28.9 ns/op 0 B/op 0 allocs/op
BenchmarkObject-8 20000000 98.5 ns/op 0 B/op 0 allocs/op
BenchmarkString-8 30000000 40.4 ns/op 0 B/op 0 allocs/op