diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java index dea07d0be52..f579a2f7592 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2Tokenizer.java @@ -140,7 +140,7 @@ class Jackson2Tokenizer implements Function> { } private void processTokenArray(JsonToken token, List result) throws IOException { - if (token != JsonToken.START_ARRAY && token != JsonToken.END_ARRAY) { + if (!isTopLevelArrayToken(token)) { this.tokenBuffer.copyCurrentEvent(this.parser); } @@ -151,6 +151,11 @@ class Jackson2Tokenizer implements Function> { } } + private boolean isTopLevelArrayToken(JsonToken token) { + return (token == JsonToken.START_ARRAY && this.arrayDepth == 1) || + (token == JsonToken.END_ARRAY && this.arrayDepth == 0); + } + public void endOfInput() { this.inputFeeder.endOfInput(); } diff --git a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2TokenizerTests.java b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2TokenizerTests.java index 577e05135d8..64d8332d803 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2TokenizerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2TokenizerTests.java @@ -116,6 +116,19 @@ public class Jackson2TokenizerTests extends AbstractDataBufferAllocatingTestCase asList("{\"foo\": \"bar\"}", "{\"foo\": \"baz\"}")); + // SPR-15803 + testTokenize( + singletonList("[" + + "{\"id\":\"0\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}," + + "{\"id\":\"1\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}," + + "{\"id\":\"2\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}" + + "]"), + asList( + "{\"id\":\"0\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}", + "{\"id\":\"1\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}", + "{\"id\":\"2\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}") + ); + testTokenize( asList("[{\"foo\": \"foofoo\", \"bar\"", ": \"barbar\"},{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}]"),