Refactor BasicJsonParser to simplify JSON parsing logic
See gh-41876
This commit is contained in:
parent
5ee522598f
commit
4a41006ee0
|
@ -52,7 +52,7 @@ public class BasicJsonParser extends AbstractJsonParser {
|
|||
|
||||
private List<Object> parseListInternal(int nesting, String json) {
|
||||
List<Object> 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<String, Object> parseMapInternal(int nesting, String json) {
|
||||
Map<String, Object> 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<String> tokenize(String json) {
|
||||
List<String> list = new ArrayList<>();
|
||||
int index = 0;
|
||||
|
|
Loading…
Reference in New Issue