diff --git a/jlexer/lexer.go b/jlexer/lexer.go index 4611094..d4f5392 100644 --- a/jlexer/lexer.go +++ b/jlexer/lexer.go @@ -482,7 +482,7 @@ func (r *Lexer) SkipRecursive() { for i, c := range r.Data[r.pos:] { switch { - case c == start: + case c == start && !inQuotes: level++ case c == end && !inQuotes: level-- diff --git a/jlexer/lexer_test.go b/jlexer/lexer_test.go index 0f3833e..900ab61 100644 --- a/jlexer/lexer_test.go +++ b/jlexer/lexer_test.go @@ -112,13 +112,22 @@ func TestSkipRecursive(t *testing.T) { }{ {toParse: "5, 4", left: ", 4"}, {toParse: "[5, 6], 4", left: ", 4"}, + {toParse: "[5, [7,8]]: 4", left: ": 4"}, + + {toParse: `{"a":1}, 4`, left: ", 4"}, + {toParse: `{"a":1, "b":{"c": 5}, "e":[12,15]}, 4`, left: ", 4"}, + + // array start/end chars in a string {toParse: `[5, "]"], 4`, left: ", 4"}, {toParse: `[5, "\"]"], 4`, left: ", 4"}, - {toParse: "[5, [7,8]]: 4", left: ": 4"}, - {toParse: `{"a":1}, 4`, left: ", 4"}, + {toParse: `[5, "["], 4`, left: ", 4"}, + {toParse: `[5, "\"["], 4`, left: ", 4"}, + + // object start/end chars in a string {toParse: `{"a}":1}, 4`, left: ", 4"}, {toParse: `{"a\"}":1}, 4`, left: ", 4"}, - {toParse: `{"a":1, "b":{"c": 5}, "e":[12,15]}, 4`, left: ", 4"}, + {toParse: `{"a{":1}, 4`, left: ", 4"}, + {toParse: `{"a\"{":1}, 4`, left: ", 4"}, } { l := Lexer{Data: []byte(test.toParse)}