67 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
[](https://godoc.org/github.com/exponent-io/jsonpath)
 | 
						|
[](https://travis-ci.org/exponent-io/jsonpath)
 | 
						|
 | 
						|
# jsonpath
 | 
						|
 | 
						|
This package extends the [json.Decoder](https://golang.org/pkg/encoding/json/#Decoder) to support navigating a stream of JSON tokens. You should be able to use this extended Decoder places where a json.Decoder would have been used.
 | 
						|
 | 
						|
This Decoder has the following enhancements...
 | 
						|
 * The [Scan](https://godoc.org/github.com/exponent-io/jsonpath/#Decoder.Scan) method supports scanning a JSON stream while extracting particular values along the way using [PathActions](https://godoc.org/github.com/exponent-io/jsonpath#PathActions).
 | 
						|
 * The [SeekTo](https://godoc.org/github.com/exponent-io/jsonpath#Decoder.SeekTo) method supports seeking forward in a JSON token stream to a particular path.
 | 
						|
 * The [Path](https://godoc.org/github.com/exponent-io/jsonpath#Decoder.Path) method returns the path of the most recently parsed token.
 | 
						|
 * The [Token](https://godoc.org/github.com/exponent-io/jsonpath#Decoder.Token) method has been modified to distinguish between strings that are object keys and strings that are values. Object key strings are returned as the [KeyString](https://godoc.org/github.com/exponent-io/jsonpath#KeyString) type rather than a native string.
 | 
						|
 | 
						|
## Installation
 | 
						|
 | 
						|
    go get -u github.com/exponent-io/jsonpath
 | 
						|
 | 
						|
## Example Usage
 | 
						|
 | 
						|
#### SeekTo
 | 
						|
 | 
						|
```go
 | 
						|
import "github.com/exponent-io/jsonpath"
 | 
						|
 | 
						|
var j = []byte(`[
 | 
						|
  {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}},
 | 
						|
  {"Space": "RGB",   "Point": {"R": 98, "G": 218, "B": 255}}
 | 
						|
]`)
 | 
						|
 | 
						|
w := json.NewDecoder(bytes.NewReader(j))
 | 
						|
var v interface{}
 | 
						|
 | 
						|
w.SeekTo(1, "Point", "G")
 | 
						|
w.Decode(&v) // v is 218
 | 
						|
```
 | 
						|
 | 
						|
#### Scan with PathActions
 | 
						|
 | 
						|
```go
 | 
						|
var j = []byte(`{"colors":[
 | 
						|
  {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10, "A": 58}},
 | 
						|
  {"Space": "RGB",   "Point": {"R": 98, "G": 218, "B": 255, "A": 231}}
 | 
						|
]}`)
 | 
						|
 | 
						|
var actions PathActions
 | 
						|
 | 
						|
// Extract the value at Point.A
 | 
						|
actions.Add(func(d *Decoder) error {
 | 
						|
  var alpha int
 | 
						|
  err := d.Decode(&alpha)
 | 
						|
  fmt.Printf("Alpha: %v\n", alpha)
 | 
						|
  return err
 | 
						|
}, "Point", "A")
 | 
						|
 | 
						|
w := NewDecoder(bytes.NewReader(j))
 | 
						|
w.SeekTo("colors", 0)
 | 
						|
 | 
						|
var ok = true
 | 
						|
var err error
 | 
						|
for ok {
 | 
						|
  ok, err = w.Scan(&actions)
 | 
						|
  if err != nil && err != io.EOF {
 | 
						|
    panic(err)
 | 
						|
  }
 | 
						|
}
 | 
						|
```
 |