Skip to content

Commit c0a75eb

Browse files
committed
Add Has
1 parent 1ebae14 commit c0a75eb

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

jsonpointer.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,32 @@ func parse(pointer string) ([]string, error) {
1919
return tokens, nil
2020
}
2121

22+
func Has(obj interface{}, pointer string) (rv bool, err error) {
23+
defer func() {
24+
if e := recover(); e != nil {
25+
err = fmt.Errorf("Invalid JSON pointer: %q: %v", pointer, e)
26+
}
27+
}()
28+
tokens, err := parse(pointer)
29+
if err != nil {
30+
return false, err
31+
}
32+
33+
i := 0
34+
v := reflect.ValueOf(obj)
35+
if len(tokens) > 0 && tokens[0] != "" {
36+
for i < len(tokens) {
37+
token := tokens[i]
38+
if n, err := strconv.Atoi(token); err == nil {
39+
v = v.Elem().Index(n)
40+
} else {
41+
v = v.MapIndex(reflect.ValueOf(token))
42+
}
43+
i++
44+
}
45+
}
46+
return true, nil
47+
}
2248
func Get(obj interface{}, pointer string) (rv interface{}, err error) {
2349
defer func() {
2450
if e := recover(); e != nil {

jsonpointer_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,37 @@ import (
66
"testing"
77
)
88

9+
var testHasCases = []struct {
10+
json string
11+
pointer string
12+
expect bool
13+
err string
14+
}{
15+
{`{"foo":[1,3,true]}`, `/foo/2`, true, ``},
16+
{`{"foo":2}`, `/foo`, true, ``},
17+
{`{"foo":[]}`, `/fooo`, false, ``},
18+
{`{"foo":3.14}`, ``, false, `Invalid JSON pointer: ""`},
19+
}
20+
21+
func TestHas(t *testing.T) {
22+
for _, testcase := range testGetCases {
23+
var obj interface{}
24+
err := json.Unmarshal([]byte(testcase.json), &obj)
25+
if err != nil {
26+
t.Fatal(err)
27+
}
28+
29+
value, err := Get(obj, testcase.pointer)
30+
if err != nil {
31+
if err.Error() != testcase.err {
32+
t.Fatal(testcase.json, err)
33+
}
34+
} else if !reflect.DeepEqual(value, testcase.expect) {
35+
t.Fatalf("Expected %v, but %v:", testcase.expect, value)
36+
}
37+
}
38+
}
39+
940
var testGetCases = []struct {
1041
json string
1142
pointer string

0 commit comments

Comments
 (0)