diff --git a/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java b/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java index ace90a3e83..fc8d8c0e23 100644 --- a/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java +++ b/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java @@ -125,9 +125,16 @@ public class BasicJsonParser implements JsonParser { int inObject = 0; int inList = 0; boolean inValue = false; + boolean inEscape = false; StringBuilder build = new StringBuilder(); while (index < json.length()) { char current = json.charAt(index); + if (inEscape) { + build.append(current); + index++; + inEscape = false; + continue; + } if (current == '{') { inObject++; } @@ -147,6 +154,9 @@ public class BasicJsonParser implements JsonParser { list.add(build.toString()); build.setLength(0); } + else if (current == '\\') { + inEscape = true; + } else { build.append(current); } diff --git a/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java b/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java index 662e97de88..e43d45369b 100644 --- a/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java @@ -170,4 +170,11 @@ public abstract class AbstractJsonParserTests { this.parser.parseList("\n\t{}"); } + @Test + public void escapeQuote() { + String input = "{\"foo\": \"\\\"bar\\\"\"}"; + Map map = this.parser.parseMap(input); + assertThat(map.get("foo")).isEqualTo("\"bar\""); + } + }