@@ -11,13 +11,13 @@ import (
11
11
12
12
// Errors
13
13
var (
14
- KeyPathNotFoundError = errors .New ("Key path not found" )
14
+ KeyPathNotFoundError = errors .New ("Key path not found" )
15
15
UnknownValueTypeError = errors .New ("Unknown value type" )
16
- MalformedJsonError = errors .New ("Malformed JSON error" )
17
- MalformedStringError = errors .New ("Value is string, but can't find closing '\" ' symbol" )
18
- MalformedArrayError = errors .New ("Value is array, but can't find closing ']' symbol" )
19
- MalformedObjectError = errors .New ("Value looks like object, but can't find closing '}' symbol" )
20
- MalformedValueError = errors .New ("Value looks like Number/Boolean/None, but can't find its end: ',' or '}' symbol" )
16
+ MalformedJsonError = errors .New ("Malformed JSON error" )
17
+ MalformedStringError = errors .New ("Value is string, but can't find closing '\" ' symbol" )
18
+ MalformedArrayError = errors .New ("Value is array, but can't find closing ']' symbol" )
19
+ MalformedObjectError = errors .New ("Value looks like object, but can't find closing '}' symbol" )
20
+ MalformedValueError = errors .New ("Value looks like Number/Boolean/None, but can't find its end: ',' or '}' symbol" )
21
21
)
22
22
23
23
func tokenEnd (data []byte ) int {
@@ -31,19 +31,12 @@ func tokenEnd(data []byte) int {
31
31
return - 1
32
32
}
33
33
34
-
35
- // Find position of next character which is not ' ', ',', '}' or ']'
36
- func nextToken (data []byte , skipComma bool ) int {
34
+ // Find position of next character which is not whitespace
35
+ func nextToken (data []byte ) int {
37
36
for i , c := range data {
38
37
switch c {
39
38
case ' ' , '\n' , '\r' , '\t' :
40
39
continue
41
- case ',' :
42
- if ! skipComma {
43
- continue
44
- } else {
45
- return i
46
- }
47
40
default :
48
41
return i
49
42
}
@@ -125,18 +118,18 @@ func searchKeys(data []byte, keys ...string) int {
125
118
i += strEnd
126
119
keyEnd := i - 1
127
120
128
- valueOffset := nextToken (data [i :], true )
121
+ valueOffset := nextToken (data [i :])
129
122
if valueOffset == - 1 {
130
123
return - 1
131
124
}
132
125
133
126
i += valueOffset
134
127
135
128
// if string is a Key, and key level match
136
- if data [i ] == ':' {
129
+ if data [i ] == ':' {
137
130
key := unsafeBytesToString (data [keyBegin :keyEnd ])
138
131
139
- if keyLevel == level - 1 && // If key nesting level match current object nested level
132
+ if keyLevel == level - 1 && // If key nesting level match current object nested level
140
133
keys [level - 1 ] == key {
141
134
keyLevel ++
142
135
// If we found all keys in path
@@ -203,8 +196,7 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
203
196
}
204
197
205
198
// Go to closest value
206
- nO := nextToken (data [offset :], false )
207
-
199
+ nO := nextToken (data [offset :])
208
200
if nO == - 1 {
209
201
return []byte {}, NotExist , - 1 , MalformedJsonError
210
202
}
@@ -286,19 +278,6 @@ func Get(data []byte, keys ...string) (value []byte, dataType ValueType, offset
286
278
return value , dataType , endOffset , nil
287
279
}
288
280
289
- func nextArrayItem (data []byte ) int {
290
- for i , c := range data {
291
- switch c {
292
- case ' ' , '\n' , '\r' , '\t' :
293
- continue
294
- default :
295
- return i
296
- }
297
- }
298
-
299
- return - 1
300
- }
301
-
302
281
// ArrayEach is used when iterating arrays, accepts a callback function with the same return arguments as `Get`.
303
282
func ArrayEach (data []byte , cb func (value []byte , dataType ValueType , offset int , err error ), keys ... string ) (err error ) {
304
283
if len (data ) == 0 {
@@ -313,8 +292,7 @@ func ArrayEach(data []byte, cb func(value []byte, dataType ValueType, offset int
313
292
}
314
293
315
294
// Go to closest value
316
- nO := nextToken (data [offset :], false )
317
-
295
+ nO := nextToken (data [offset :])
318
296
if nO == - 1 {
319
297
return MalformedJsonError
320
298
}
@@ -345,11 +323,11 @@ func ArrayEach(data []byte, cb func(value []byte, dataType ValueType, offset int
345
323
346
324
offset += o
347
325
348
- nextItem := nextArrayItem (data [offset :])
349
- if nextItem == - 1 {
326
+ skipToToken := nextToken (data [offset :])
327
+ if skipToToken == - 1 {
350
328
return MalformedArrayError
351
329
}
352
- offset += nextItem
330
+ offset += skipToToken
353
331
354
332
if data [offset ] == ']' {
355
333
break
@@ -358,6 +336,8 @@ func ArrayEach(data []byte, cb func(value []byte, dataType ValueType, offset int
358
336
if data [offset ] != ',' {
359
337
return MalformedArrayError
360
338
}
339
+
340
+ offset ++
361
341
}
362
342
363
343
return nil
0 commit comments