...

Package jsonpath

import "github.com/PaesslerAG/jsonpath"
Overview
Index
Examples

Overview ▾

Package jsonpath is an implementation of http://goessner.net/articles/JsonPath/ If a JSONPath contains one of [key1, key2 ...], .., *, [min:max], [min:max:step], (? expression) all matchs are listed in an []interface{}

The package comes with an extension of JSONPath to access the wildcard values of a match. If the JSONPath is used inside of a JSON object, you can use placeholder '#' or '#i' with natural number i to access all wildcards values or the ith wildcard

This package can be extended with gval modules for script features like multiply, length, regex or many more. So take a look at github.com/PaesslerAG/gval.

Example (Gval)

Code:

builder := gval.Full(jsonpath.PlaceholderExtension())

path, err := builder.NewEvaluable("{#1: $..[?@.ping && @.speed > 100].name}")
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

v := interface{}(nil)
err = json.Unmarshal([]byte(`{
        "device 1":{
            "name": "fancy device",
            "ping": true,
            "speed": 200,
                "subdevice 1":{
                    "ping" : true,
                    "speed" : 99,
                    "name" : "boring subdevice"
                },
                "subdevice 2":{
                    "ping" : true,
                    "speed" : 150,
                    "name" : "fancy subdevice"
                },
                "not an device":{
                    "name" : "ping me but I have no speed property",
                    "ping" : true
                }
            },
        "fictive device":{
            "ping" : false,
            "speed" : 1000,
            "name" : "dream device"
            }
        }`), &v)

if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

devices, err := path(context.Background(), v)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

for device, name := range devices.(map[string]interface{}) {
    fmt.Printf("%s -> %v\n", device, name)
}

Output:

device 1 -> fancy device
subdevice 2 -> fancy subdevice

func Get

func Get(path string, value interface{}) (interface{}, error)

Get executes given JSONPath on given value

Example

Code:

v := interface{}(nil)

json.Unmarshal([]byte(`{
        "welcome":{
                "message":["Good Morning", "Hello World!"]
            }
        }`), &v)

welcome, err := jsonpath.Get("$.welcome.message[1]", v)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

fmt.Println(welcome)

Output:

Hello World!

Example (Filter)

Code:

v := interface{}(nil)

json.Unmarshal([]byte(`[
        {"key":"a","value" : "I"},
        {"key":"b","value" : "II"},
        {"key":"c","value" : "III"}
        ]`), &v)

values, err := jsonpath.Get(`$[? @.key=="b"].value`, v)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

for _, value := range values.([]interface{}) {
    fmt.Println(value)
}

Output:

II

Example (Wildcard)

Code:

v := interface{}(nil)

json.Unmarshal([]byte(`{
        "welcome":{
                "message":["Good Morning", "Hello World!"]
            }
        }`), &v)

welcome, err := jsonpath.Get("$.welcome.message[*]", v)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

for _, value := range welcome.([]interface{}) {
    fmt.Printf("%v\n", value)
}

Output:

Good Morning
Hello World!

func Language

func Language() gval.Language

Language is the JSONPath Language

func New

func New(path string) (gval.Evaluable, error)

New returns an selector for given JSONPath

func PlaceholderExtension

func PlaceholderExtension() gval.Language

PlaceholderExtension is the JSONPath Language with placeholder