Categorygithub.com/kivera-io/jsonpath
repositorypackage
1.1.0
Repository: https://github.com/kivera-io/jsonpath.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

JSON Path

A golang implementation of jsonpath notation that allows you to retrieve and update any value in a JSON object. The value can be of any type, concrete or not.

Path Operators

The following operators are available. All operators can be used to both set and get values.

SyntaxDescriptionAlways Return Interface Slice
$.Root element. Can be ommitted.false
.keyDot notation. Recursively search the object for the specified key.false
[ key (, key) ]Bracket notation. Access one or more keys within a parent
object. Single quoted ('key') and double quoted ("key")
strings can also be used within square brackets to access keys
with special characters.
conditional
(true for multiple keys)
[ n (, n) ]Access one or more indices in a parent array. Negative indices
are also allowed.
conditional
(true for multiple indices)
[ start:end ]Access a range of indicies in a parent array from the start index,
up to but not including the end index. This notation can also
be used alongside single index access.
true
[ n: ]Access a range of indicies in a parent array from the start index
until the end of the array.
true
[ :n ]Access a range of indicies in a parent array from the start of
the array, up to but not including the end index.
true
..keyRescursive descent. Search for all instances of the specified
keys/indices. Works with multiple keys, indices and ranges.
true
.* or [*]Access all elements in the parent object/array.true

*** Note: any query that could return multiple results will always return a slice of interfaces ([]interface{}). ***

Examples

PathDescripton
key1.key2.key3Dot notation
[key1][key2][key3]Bracket notation
key1[key2].key3Combination of both dot and bracket notation
map['Key with spaces']Access a map key with special characters
array[0]Access first element of array
array[-1]Access last element of array
array[1:3]Access the second and third element of array
array[:3]Access the first three elements of array
array[-3:]Access the last three elements of array
array[ 0, -1, 2:5 ]Access first, last, and third until fifth element of array
map[ key1, key2 ]Access key1 and key2 in map
map[ key1, key2 ].propertyAccess a property from key1 and key2 in map
array[*]Access all elements of array
map.*Access all items in map
map[*].propertyAccess a property from all items in map
map..propertyAccess a property from all nested objects within map
map..[0,1]Access the first and second elements from all nested arrays within map

In Code

First, unmarshal your json string into an interface. Then call jsonpath.Set() and jsonpath.Get() to access and manipulate the data.

import "github.com/kivera-io/jsonpath"

example := "{}"
var data interface{}

err := json.Unmarshal([]byte(example), &data)
if err != nil {
    panic(err)
}

// set value at a path
err = jsonpath.Set(data, "test.path", "value")
if err != nil {
    panic(err)
}

// get value at a path
val, err := jsonpath.Get(data, "test.path")
if err != nil {
    panic(err)
}
fmt.Println(val)

You can alternatively compile the json path for re-use in order to improve performance.

import "github.com/kivera-io/jsonpath"

example := "{}"
var data interface{}

err := json.Unmarshal([]byte(example), &data)
if err != nil {
    panic(err)
}

j, err := jsonpath.Compile("test.path")
if err != nil {
    panic(err)
}

// set value at a path
err = j.Set(data, "value")
if err != nil {
    panic(err)
}

// get value at a path
val, err := j.Get(data)
if err != nil {
    panic(err)
}
fmt.Println(val)

Error Handling

There are two types of errors that can be thrown. Ether InvalidPath or NotFound.

InvalidPath is thrown when a path with invalid syntax has been provided.

NotFound indicates that the path has valid syntax, but it does not exist in, or is not valid with, the provided data.

To differentiate between the different errors.

if err.(*jsonpath.Error).Code == jsonpath.NotFound {
   do something...
}