Refactor BasicJsonParser to simplify JSON parsing logic

See gh-41876
This commit is contained in:
hyunmin0317 2024-08-15 21:49:51 +09:00 committed by Moritz Halbritter
parent 5ee522598f
commit 4a41006ee0
1 changed files with 23 additions and 17 deletions

View File

@ -52,7 +52,7 @@ public class BasicJsonParser extends AbstractJsonParser {
private List<Object> parseListInternal(int nesting, String json) { private List<Object> parseListInternal(int nesting, String json) {
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList<>();
json = trimLeadingCharacter(trimTrailingCharacter(json, ']'), '[').trim(); json = trimEdges(json, '[', ']').trim();
for (String value : tokenize(json)) { for (String value : tokenize(json)) {
list.add(parseInternal(nesting + 1, value)); list.add(parseInternal(nesting + 1, value));
} }
@ -70,37 +70,39 @@ public class BasicJsonParser extends AbstractJsonParser {
return parseMapInternal(nesting + 1, json); return parseMapInternal(nesting + 1, json);
} }
if (json.startsWith("\"")) { if (json.startsWith("\"")) {
return trimTrailingCharacter(trimLeadingCharacter(json, '"'), '"'); return trimEdges(json, '"', '"');
} }
try { return parseNumber(json);
return Long.valueOf(json);
}
catch (NumberFormatException ex) {
// ignore
}
try {
return Double.valueOf(json);
}
catch (NumberFormatException ex) {
// ignore
}
return json;
} }
private Map<String, Object> parseMapInternal(int nesting, String json) { private Map<String, Object> parseMapInternal(int nesting, String json) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
json = trimLeadingCharacter(trimTrailingCharacter(json, '}'), '{').trim(); json = trimEdges(json, '{', '}').trim();
for (String pair : tokenize(json)) { for (String pair : tokenize(json)) {
String[] values = StringUtils.trimArrayElements(StringUtils.split(pair, ":")); String[] values = StringUtils.trimArrayElements(StringUtils.split(pair, ":"));
Assert.state(values[0].startsWith("\"") && values[0].endsWith("\""), Assert.state(values[0].startsWith("\"") && values[0].endsWith("\""),
"Expecting double-quotes around field names"); "Expecting double-quotes around field names");
String key = trimLeadingCharacter(trimTrailingCharacter(values[0], '"'), '"'); String key = trimEdges(values[0], '"', '"');
Object value = parseInternal(nesting, values[1]); Object value = parseInternal(nesting, values[1]);
map.put(key, value); map.put(key, value);
} }
return map; 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) { private static String trimTrailingCharacter(String string, char c) {
if (!string.isEmpty() && string.charAt(string.length() - 1) == c) { if (!string.isEmpty() && string.charAt(string.length() - 1) == c) {
return string.substring(0, string.length() - 1); return string.substring(0, string.length() - 1);
@ -115,6 +117,10 @@ public class BasicJsonParser extends AbstractJsonParser {
return string; return string;
} }
private static String trimEdges(String string, char leadingChar, char trailingChar) {
return trimTrailingCharacter(trimLeadingCharacter(string, leadingChar), trailingChar);
}
private List<String> tokenize(String json) { private List<String> tokenize(String json) {
List<String> list = new ArrayList<>(); List<String> list = new ArrayList<>();
int index = 0; int index = 0;