diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java index 7bfaf0997f..b24f98e36a 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java @@ -49,7 +49,7 @@ public class BasicJsonParser extends AbstractJsonParser { private List parseListInternal(String json) { List list = new ArrayList<>(); - json = trimLeadingCharacter(trimTrailingCharacter(json, ']'), '['); + json = trimLeadingCharacter(trimTrailingCharacter(json, ']'), '[').trim(); for (String value : tokenize(json)) { list.add(parseInternal(value)); } @@ -97,7 +97,7 @@ public class BasicJsonParser extends AbstractJsonParser { private Map parseMapInternal(String json) { Map map = new LinkedHashMap<>(); - json = trimLeadingCharacter(trimTrailingCharacter(json, '}'), '{'); + json = trimLeadingCharacter(trimTrailingCharacter(json, '}'), '{').trim(); for (String pair : tokenize(json)) { String[] values = StringUtils.trimArrayElements(StringUtils.split(pair, ":")); String key = trimLeadingCharacter(trimTrailingCharacter(values[0], '"'), '"'); @@ -151,7 +151,7 @@ public class BasicJsonParser extends AbstractJsonParser { index++; } if (build.length() > 0) { - list.add(build.toString()); + list.add(build.toString().trim()); } return list; } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java index a5822a3520..8878ca388d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java @@ -101,6 +101,17 @@ abstract class AbstractJsonParserTests { .parseMap("{\"foo\":[{\"foo\":\"bar\",\"spam\":1},{\"foo\":\"baz\",\"spam\":2}]}"); assertThat(map).hasSize(1); assertThat(((List) map.get("foo"))).hasSize(2); + assertThat(map.get("foo")).asList().allMatch(Map.class::isInstance); + } + + @SuppressWarnings("unchecked") + @Test + void nestedLeadingAndTrailingWhitespace() { + Map map = this.parser.parseMap( + " {\"foo\": [ { \"foo\" : \"bar\" , \"spam\" : 1 } , { \"foo\" : \"baz\" , \"spam\" : 2 } ] } "); + assertThat(map).hasSize(1); + assertThat(((List) map.get("foo"))).hasSize(2); + assertThat(map.get("foo")).asList().allMatch(Map.class::isInstance); } @Test