This was mostly an experiment to learn go and test using closures to interpret a JSON path. You should use https://github.com/PaesslerAG/jsonpath instead.
a (partial) implementation in Go based on Stefan Goener JSON Path
- No support for subexpressions :
$books[(@.length-1)]
- No support for filters :
$books[?(@.price > 10)]
- Strings in brackets must use double quotes :
$["bookstore"]
- Cannot operate on struct fields
The third limitation comes from using the text/scanner
package from the standard library.
The last one could be overcome by using reflection.
All expressions start $
.
Examples (supported by the current implementation) :
$
the current object (or array)$.books
access to the key of an object (or$["books"]
with bracket syntax)$.books[1]
access to the index of an array$.books[1].authors[1].name
chaining of keys and index$["books"][1]["authors"][1]["name"]
the same with braket syntax$.books[0,1,3]
union on an array$["books", "songs", "movies"]
union on an object$books[1:3]
second and third items of an array$books[:-2:2]
every two items except the last two of an array$books[::-1]
all items in reversed order$..authors
all authors (recursive search)
Checkout the tests for more examples.
go get github.com/yalp/jsonpath
A jsonpath applies to any JSON decoded data using interface{}
when decoded with encoding/json :
var bookstore interface{}
err := json.Unmarshal(data, &bookstore)
authors, err := jsonpath.Read(bookstore, "$..authors")
A jsonpath expression can be prepared to be reused multiple times :
allAuthors, err = jsonpath.Prepare("$..authors")
...
var bookstore interface{}
err := json.Unmarshal(data, &bookstore)
authors, err := allAuthors(bookstore)
The type of the values returned by the Read
method or Prepare
functions depends on the jsonpath expression.