-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjsonarray.go
More file actions
88 lines (84 loc) · 1.49 KB
/
jsonarray.go
File metadata and controls
88 lines (84 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
@Time : 2019-03-27 18:27
@Author : seefan
@File : jsonarr
@Software: jsonreader
*/
package jsonreader
import (
"bytes"
)
type JsonArray struct {
reader
arr []JsonValue
}
func (j *JsonArray) Get(i int) JsonValue {
return j.arr[i]
}
func (j *JsonArray) Size() int {
return len(j.arr)
}
func ParseJsonArray(bs []byte) *JsonArray {
j := &JsonArray{
reader: *newReader(bs),
}
j.parse()
return j
}
func (j *JsonArray) Each(f func(int, JsonValue)) {
if j.arr != nil {
for i, v := range j.arr {
f(i, v)
}
}
}
func (j *JsonArray) parse() {
if !j.validArray() {
j.LastError = "JsonArray format error"
j.end = -1
return
}
//remove []
//可以考虑使用,可能性能会更高strings.Index()
j.index++
j.end--
j.skip()
start := j.index
str := 0
depth := 0
for j.index < j.end {
switch j.data[j.index] {
case '[', '{':
if str%2 == 0 {
depth++
}
case ']', '}':
if str%2 == 0 {
depth--
}
case '"':
str++
case '\\':
if j.index+1 < j.end && j.data[j.index+1] == '"' {
j.index++
}
case ',':
if depth == 0 && str%2 == 0 {
if j.data[start] == '"' {
j.arr = append(j.arr, JsonValue(j.data[start+1:j.index-1]))
} else {
j.arr = append(j.arr, JsonValue(bytes.TrimSpace(j.data[start:j.index])))
}
start = j.index + 1
}
}
j.index++
}
if start < j.index {
if j.data[start] == '"' {
j.arr = append(j.arr, JsonValue(j.data[start+1:j.index-1]))
} else {
j.arr = append(j.arr, JsonValue(j.data[start:j.index]))
}
}
}