mirror of https://github.com/tidwall/gjson.git
parent
7460ecfe69
commit
7405f21134
|
@ -128,7 +128,7 @@ result.Str // holds the string
|
|||
result.Num // holds the float64 number
|
||||
result.Raw // holds the raw json
|
||||
result.Index // index of raw value in original json, zero means index unknown
|
||||
result.HashtagIndexes // hashtagIndexes contains the indexes of the elements returned by a query containing the '#' character
|
||||
result.Indexes // Indexes contains the indexes of the elements returned by a query containing the '#' character
|
||||
```
|
||||
|
||||
There are a variety of handy functions that work on a result:
|
||||
|
|
17
gjson.go
17
gjson.go
|
@ -64,8 +64,8 @@ type Result struct {
|
|||
Num float64
|
||||
// Index of raw value in original json, zero means index unknown
|
||||
Index int
|
||||
// HashtagIndexes contains the Indexes of the elements returned by a query containing the '#' character
|
||||
HashtagIndexes []int
|
||||
// Indexes contains the Indexes of the elements returned by a query containing the '#' character
|
||||
Indexes []int
|
||||
}
|
||||
|
||||
// String returns a string representation of the value.
|
||||
|
@ -1263,7 +1263,7 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
|||
var alog []int
|
||||
var partidx int
|
||||
var multires []byte
|
||||
var hashtagQueryIndex []int
|
||||
var queryIndexes []int
|
||||
rp := parseArrayPath(path)
|
||||
if !rp.arrch {
|
||||
n, ok := parseUint(rp.part)
|
||||
|
@ -1319,7 +1319,7 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
|||
multires = append(multires, ',')
|
||||
}
|
||||
multires = append(multires, raw...)
|
||||
hashtagQueryIndex = append(hashtagQueryIndex, res.Index+parentIndex)
|
||||
queryIndexes = append(queryIndexes, res.Index+parentIndex)
|
||||
}
|
||||
} else {
|
||||
c.value = res
|
||||
|
@ -1484,7 +1484,7 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
|||
c.pipe = right
|
||||
c.piped = true
|
||||
}
|
||||
var hashtagIndexes = make([]int, 0, 64)
|
||||
var indexes = make([]int, 0, 64)
|
||||
var jsons = make([]byte, 0, 64)
|
||||
jsons = append(jsons, '[')
|
||||
for j, k := 0, 0; j < len(alog); j++ {
|
||||
|
@ -1511,7 +1511,7 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
|||
raw = res.String()
|
||||
}
|
||||
jsons = append(jsons, []byte(raw)...)
|
||||
hashtagIndexes = append(hashtagIndexes, res.Index+parentIndex)
|
||||
indexes = append(indexes, res.Index+parentIndex)
|
||||
k++
|
||||
}
|
||||
}
|
||||
|
@ -1520,7 +1520,7 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
|||
jsons = append(jsons, ']')
|
||||
c.value.Type = JSON
|
||||
c.value.Raw = string(jsons)
|
||||
c.value.HashtagIndexes = hashtagIndexes
|
||||
c.value.Indexes = indexes
|
||||
return i + 1, true
|
||||
}
|
||||
if rp.alogok {
|
||||
|
@ -1538,7 +1538,7 @@ func parseArray(c *parseContext, i int, path string) (int, bool) {
|
|||
c.value = Result{
|
||||
Raw: string(append(multires, ']')),
|
||||
Type: JSON,
|
||||
HashtagIndexes: hashtagQueryIndex,
|
||||
Indexes: queryIndexes,
|
||||
}
|
||||
} else if rp.query.all {
|
||||
c.value = Result{
|
||||
|
@ -1819,6 +1819,7 @@ func Get(json, path string) Result {
|
|||
if len(path) > 0 && (path[0] == '|' || path[0] == '.') {
|
||||
res := Get(rjson, path[1:])
|
||||
res.Index = 0
|
||||
res.Indexes = nil
|
||||
return res
|
||||
}
|
||||
return Parse(rjson)
|
||||
|
|
|
@ -1291,10 +1291,10 @@ func TestArrayValues(t *testing.T) {
|
|||
}
|
||||
expect := strings.Join([]string{
|
||||
`gjson.Result{Type:3, Raw:"\"PERSON1\"", Str:"PERSON1", Num:0, ` +
|
||||
`Index:0, HashtagIndexes:[]int(nil)}`,
|
||||
`Index:0, Indexes:[]int(nil)}`,
|
||||
`gjson.Result{Type:3, Raw:"\"PERSON2\"", Str:"PERSON2", Num:0, ` +
|
||||
`Index:0, HashtagIndexes:[]int(nil)}`,
|
||||
`gjson.Result{Type:2, Raw:"0", Str:"", Num:0, Index:0, HashtagIndexes:[]int(nil)}`,
|
||||
`Index:0, Indexes:[]int(nil)}`,
|
||||
`gjson.Result{Type:2, Raw:"0", Str:"", Num:0, Index:0, Indexes:[]int(nil)}`,
|
||||
}, "\n")
|
||||
if output != expect {
|
||||
t.Fatalf("expected '%v', got '%v'", expect, output)
|
||||
|
@ -2122,7 +2122,7 @@ func TestModifierDoubleQuotes(t *testing.T) {
|
|||
|
||||
}
|
||||
|
||||
func TestHashtagIndexes(t *testing.T) {
|
||||
func TestIndexes(t *testing.T) {
|
||||
var exampleJSON = `{
|
||||
"vals": [
|
||||
[1,66,{test: 3}],
|
||||
|
@ -2150,14 +2150,18 @@ func TestHashtagIndexes(t *testing.T) {
|
|||
`objectArray.#(age>43)#.first`,
|
||||
[]string{`"`, `"`},
|
||||
},
|
||||
{
|
||||
`objectArray.@reverse.#.first`,
|
||||
nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range testCases {
|
||||
r := Get(exampleJSON, tc.path)
|
||||
|
||||
assert(t, len(r.HashtagIndexes) == len(tc.expected))
|
||||
assert(t, len(r.Indexes) == len(tc.expected))
|
||||
|
||||
for i, a := range r.HashtagIndexes {
|
||||
for i, a := range r.Indexes {
|
||||
assert(t, string(exampleJSON[a]) == tc.expected[i])
|
||||
}
|
||||
}
|
||||
|
@ -2178,10 +2182,10 @@ func TestHashtagIndexesMatchesRaw(t *testing.T) {
|
|||
if v.IsArray() {
|
||||
v.ForEach(func(_, sv Result) bool {
|
||||
if sv.IsObject() {
|
||||
assert(t, string(exampleJSON[r.HashtagIndexes[0]:r.HashtagIndexes[0]+len(sv.Raw)]) == sv.Raw)
|
||||
assert(t, string(exampleJSON[r.Indexes[0]:r.Indexes[0]+len(sv.Raw)]) == sv.Raw)
|
||||
}
|
||||
if sv.IsArray() {
|
||||
assert(t, string(exampleJSON[r.HashtagIndexes[1]:r.HashtagIndexes[1]+len(sv.Raw)]) == sv.Raw)
|
||||
assert(t, string(exampleJSON[r.Indexes[1]:r.Indexes[1]+len(sv.Raw)]) == sv.Raw)
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue