diff --git a/core/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java b/core/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java index dc01f6827b0..673fc608b72 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/json/BasicJsonParser.java @@ -155,7 +155,12 @@ public class BasicJsonParser extends AbstractJsonParser { build.setLength(0); } else if (ch == '\\') { - tracking.set(Tracked.ESCAPE, 1); + if (tracking.in(Tracked.OBJECT, Tracked.LIST)) { + build.append(ch); + } + else { + tracking.set(Tracked.ESCAPE, 1); + } } else { build.append(ch); diff --git a/core/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java b/core/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java index c3c3b669825..bad3ba6266c 100644 --- a/core/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java +++ b/core/spring-boot/src/test/java/org/springframework/boot/json/AbstractJsonParserTests.java @@ -175,10 +175,77 @@ abstract class AbstractJsonParserTests { } @Test - void escapeDoubleQuote() { - String input = "{\"foo\": \"\\\"bar\\\"\"}"; + void escapeBackslash() { + String input = """ + { + "a": "alpha\\\\" + } + """; Map map = this.parser.parseMap(input); - assertThat(map).containsEntry("foo", "\"bar\""); + assertThat(map).containsEntry("a", "alpha\\"); + } + + @Test + void escapeDoubleQuote() { + String input = """ + { + "a": "alpha\\\"" + } + """; + Map map = this.parser.parseMap(input); + assertThat(map).containsEntry("a", "alpha\""); + } + + @Test + void escapeBackslashInNestedMap() { + String input = """ + { + "outer": { + "a": "alpha\\\\" + } + } + """; + Map map = this.parser.parseMap(input); + assertThat(map).extractingByKey("outer", InstanceOfAssertFactories.MAP).containsEntry("a", "alpha\\"); + } + + @Test + void escapeDoubleQuoteInNestedMap() { + String input = """ + { + "outer": { + "a": "alpha\\\"" + } + } + """; + Map map = this.parser.parseMap(input); + assertThat(map).extractingByKey("outer", InstanceOfAssertFactories.MAP).containsEntry("a", "alpha\""); + } + + @Test + void escapeBackslashInNestedList() { + String input = """ + { + "list": [ + "alpha\\\\" + ] + } + """; + Map map = this.parser.parseMap(input); + assertThat(map).extractingByKey("list", InstanceOfAssertFactories.LIST).containsExactly("alpha\\"); + } + + @Test + void escapeDoubleQuoteInNestedList() { + String input = """ + { + "list": [ + "alpha\\\"" + ] + } + """; + Map map = this.parser.parseMap(input); + assertThat(map).extractingByKey("list", InstanceOfAssertFactories.LIST).containsExactly("alpha\""); } @Test