forked from mirror/gjson
Allow for chaining syntax in multi array
This commit is contained in:
parent
6eb62ca33f
commit
e91a88bec4
20
gjson.go
20
gjson.go
|
@ -1270,6 +1270,12 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
||||||
res := Get(val, rp.query.path)
|
res := Get(val, rp.query.path)
|
||||||
if queryMatches(&rp, res) {
|
if queryMatches(&rp, res) {
|
||||||
if rp.more {
|
if rp.more {
|
||||||
|
left, right, ok := splitPossiblePipe(rp.path)
|
||||||
|
if ok {
|
||||||
|
rp.path = left
|
||||||
|
c.pipe = right
|
||||||
|
c.piped = true
|
||||||
|
}
|
||||||
res = Get(val, rp.path)
|
res = Get(val, rp.path)
|
||||||
} else {
|
} else {
|
||||||
res = Result{Raw: val, Type: JSON}
|
res = Result{Raw: val, Type: JSON}
|
||||||
|
@ -1277,10 +1283,18 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
||||||
if rp.query.all {
|
if rp.query.all {
|
||||||
if len(multires) == 0 {
|
if len(multires) == 0 {
|
||||||
multires = append(multires, '[')
|
multires = append(multires, '[')
|
||||||
} else {
|
|
||||||
multires = append(multires, ',')
|
|
||||||
}
|
}
|
||||||
multires = append(multires, res.Raw...)
|
|
||||||
|
raw := res.Raw
|
||||||
|
if len(raw) == 0 {
|
||||||
|
raw = res.String()
|
||||||
|
}
|
||||||
|
if raw != "" {
|
||||||
|
if len(multires) > 1 {
|
||||||
|
multires = append(multires, ',')
|
||||||
|
}
|
||||||
|
multires = append(multires, raw...)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
c.value = res
|
c.value = res
|
||||||
return i, true
|
return i, true
|
||||||
|
|
|
@ -1704,3 +1704,60 @@ func TestDeepSelectors(t *testing.T) {
|
||||||
t.Fatalf("expected '%v', got '%v'", "Murphy", res)
|
t.Fatalf("expected '%v', got '%v'", "Murphy", res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMultiArrayEx(t *testing.T) {
|
||||||
|
json := `{
|
||||||
|
"info": {
|
||||||
|
"friends": [
|
||||||
|
{
|
||||||
|
"first": "Dale", "last": "Murphy", "kind": "Person",
|
||||||
|
"cust1": true,
|
||||||
|
"extra": [10,20,30],
|
||||||
|
"details": {
|
||||||
|
"city": "Tempe",
|
||||||
|
"state": "Arizona"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"first": "Roger", "last": "Craig", "kind": "Person",
|
||||||
|
"cust2": false,
|
||||||
|
"extra": [40,50,60],
|
||||||
|
"details": {
|
||||||
|
"city": "Phoenix",
|
||||||
|
"state": "Arizona"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
var res string
|
||||||
|
|
||||||
|
res = Get(json, `info.friends.#[kind="Person"]#.kind|0`).String()
|
||||||
|
if res != "Person" {
|
||||||
|
t.Fatalf("expected '%v', got '%v'", "Person", res)
|
||||||
|
}
|
||||||
|
res = Get(json, `info.friends.#.kind|0`).String()
|
||||||
|
if res != "Person" {
|
||||||
|
t.Fatalf("expected '%v', got '%v'", "Person", res)
|
||||||
|
}
|
||||||
|
|
||||||
|
res = Get(json, `info.friends.#[kind="Person"]#.kind`).String()
|
||||||
|
if res != `["Person","Person"]` {
|
||||||
|
t.Fatalf("expected '%v', got '%v'", `["Person","Person"]`, res)
|
||||||
|
}
|
||||||
|
res = Get(json, `info.friends.#.kind`).String()
|
||||||
|
if res != `["Person","Person"]` {
|
||||||
|
t.Fatalf("expected '%v', got '%v'", `["Person","Person"]`, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
res = Get(json, `info.friends.#[kind="Person"]#|kind`).String()
|
||||||
|
if res != `` {
|
||||||
|
t.Fatalf("expected '%v', got '%v'", ``, res)
|
||||||
|
}
|
||||||
|
res = Get(json, `info.friends.#|kind`).String()
|
||||||
|
if res != `` {
|
||||||
|
t.Fatalf("expected '%v', got '%v'", ``, res)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue