@@ -187,7 +187,7 @@ func init() {
187187}
188188
189189func EachKey (data []byte , cb func (int , []byte , ValueType , error ), paths ... []string ) int {
190- var pathFlags int64
190+ var pathFlags , ignorePathFlags int64
191191 var level , pathsMatched , i int
192192 ln := len (data )
193193
@@ -214,7 +214,6 @@ func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...[]str
214214
215215 i += valueOffset
216216
217-
218217 // if string is a key, and key level match
219218 if data [i ] == ':' {
220219 match := false
@@ -232,7 +231,7 @@ func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...[]str
232231 }
233232
234233 for pi , p := range paths {
235- if len (p ) < level || (pathFlags & bitwiseFlags [pi ]) != 0 {
234+ if len (p ) < level || (pathFlags & bitwiseFlags [pi ]) != 0 || ( ignorePathFlags & bitwiseFlags [ pi ] != 0 ) {
236235 continue
237236 }
238237
@@ -255,10 +254,13 @@ func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...[]str
255254 return i
256255 }
257256 }
257+ } else {
258+ ignorePathFlags |= bitwiseFlags [pi ]
258259 }
259260 }
260261
261262 if ! match {
263+ ignorePathFlags = 0
262264 tokenOffset := nextToken (data [i + 1 :])
263265 i += tokenOffset
264266
@@ -267,6 +269,11 @@ func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...[]str
267269 i += blockSkip + 1
268270 }
269271 }
272+
273+ switch data [i ] {
274+ case '{' , '}' , '[' , '"' :
275+ i --
276+ }
270277 } else {
271278 i --
272279 }
0 commit comments