From 14ccb38523c5b23ee8c3ac37d93c19b4a7bf24b0 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 21 Jul 2017 13:43:38 +0200 Subject: [PATCH] Handle nested w/o top-level array in Jackson2JsonTokenizer Issue: SPR-15803 --- .../http/codec/json/Jackson2Tokenizer.java | 4 ++-- .../http/codec/json/Jackson2TokenizerTests.java | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) 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 f579a2f7592..9f6248a2ab9 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 @@ -152,8 +152,8 @@ class Jackson2Tokenizer implements Function> { } private boolean isTopLevelArrayToken(JsonToken token) { - return (token == JsonToken.START_ARRAY && this.arrayDepth == 1) || - (token == JsonToken.END_ARRAY && this.arrayDepth == 0); + return this.objectDepth == 0 && ((token == JsonToken.START_ARRAY && this.arrayDepth == 1) || + (token == JsonToken.END_ARRAY && this.arrayDepth == 0)); } public void 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 64d8332d803..0f5633ef4f0 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 @@ -57,7 +57,7 @@ public class Jackson2TokenizerTests extends AbstractDataBufferAllocatingTestCase } @Test - public void noTokenizeArrayElements() { + public void doNotTokenizeArrayElements() { this.tokenizer = new Jackson2Tokenizer(this.jsonParser, false); testTokenize( @@ -116,7 +116,7 @@ public class Jackson2TokenizerTests extends AbstractDataBufferAllocatingTestCase asList("{\"foo\": \"bar\"}", "{\"foo\": \"baz\"}")); - // SPR-15803 + // SPR-15803: nested array testTokenize( singletonList("[" + "{\"id\":\"0\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}," + @@ -129,6 +129,11 @@ public class Jackson2TokenizerTests extends AbstractDataBufferAllocatingTestCase "{\"id\":\"2\",\"start\":[-999999999,1,1],\"end\":[999999999,12,31]}") ); + // SPR-15803: nested array, no top-level array + testTokenize( + singletonList("{\"speakerIds\":[\"tastapod\"],\"language\":\"ENGLISH\"}"), + singletonList("{\"speakerIds\":[\"tastapod\"],\"language\":\"ENGLISH\"}")); + testTokenize( asList("[{\"foo\": \"foofoo\", \"bar\"", ": \"barbar\"},{\"foo\": \"foofoofoo\", \"bar\": \"barbarbar\"}]"),