From 4a41006ee0c852785b4afd904d9a7e3dce131c12 Mon Sep 17 00:00:00 2001 From: hyunmin0317 Date: Thu, 15 Aug 2024 21:49:51 +0900 Subject: [PATCH 1/2] Refactor BasicJsonParser to simplify JSON parsing logic See gh-41876 --- .../boot/json/BasicJsonParser.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) 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 130245d5bb9..3a48830dfec 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 @@ -52,7 +52,7 @@ public class BasicJsonParser extends AbstractJsonParser { private List parseListInternal(int nesting, String json) { List list = new ArrayList<>(); - json = trimLeadingCharacter(trimTrailingCharacter(json, ']'), '[').trim(); + json = trimEdges(json, '[', ']').trim(); for (String value : tokenize(json)) { list.add(parseInternal(nesting + 1, value)); } @@ -70,37 +70,39 @@ public class BasicJsonParser extends AbstractJsonParser { return parseMapInternal(nesting + 1, json); } if (json.startsWith("\"")) { - return trimTrailingCharacter(trimLeadingCharacter(json, '"'), '"'); + return trimEdges(json, '"', '"'); } - try { - return Long.valueOf(json); - } - catch (NumberFormatException ex) { - // ignore - } - try { - return Double.valueOf(json); - } - catch (NumberFormatException ex) { - // ignore - } - return json; + return parseNumber(json); } private Map parseMapInternal(int nesting, String json) { Map map = new LinkedHashMap<>(); - json = trimLeadingCharacter(trimTrailingCharacter(json, '}'), '{').trim(); + json = trimEdges(json, '{', '}').trim(); for (String pair : tokenize(json)) { String[] values = StringUtils.trimArrayElements(StringUtils.split(pair, ":")); Assert.state(values[0].startsWith("\"") && values[0].endsWith("\""), "Expecting double-quotes around field names"); - String key = trimLeadingCharacter(trimTrailingCharacter(values[0], '"'), '"'); + String key = trimEdges(values[0], '"', '"'); Object value = parseInternal(nesting, values[1]); map.put(key, value); } return map; } + private Object parseNumber(String json) { + try { + return Long.valueOf(json); + } + catch (NumberFormatException e) { + try { + return Double.valueOf(json); + } + catch (NumberFormatException ex) { + return json; + } + } + } + private static String trimTrailingCharacter(String string, char c) { if (!string.isEmpty() && string.charAt(string.length() - 1) == c) { return string.substring(0, string.length() - 1); @@ -115,6 +117,10 @@ public class BasicJsonParser extends AbstractJsonParser { return string; } + private static String trimEdges(String string, char leadingChar, char trailingChar) { + return trimTrailingCharacter(trimLeadingCharacter(string, leadingChar), trailingChar); + } + private List tokenize(String json) { List list = new ArrayList<>(); int index = 0; From 66a41db079c82db79094d9d3a18f3636e252ac8e Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 21 Aug 2024 13:20:36 +0200 Subject: [PATCH 2/2] Polish "Refactor BasicJsonParser to simplify JSON parsing logic" See gh-41876 --- .../java/org/springframework/boot/json/BasicJsonParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 3a48830dfec..6a16d0c84c1 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 @@ -93,11 +93,11 @@ public class BasicJsonParser extends AbstractJsonParser { try { return Long.valueOf(json); } - catch (NumberFormatException e) { + catch (NumberFormatException ex) { try { return Double.valueOf(json); } - catch (NumberFormatException ex) { + catch (NumberFormatException ex2) { return json; } }