|
|
|
@ -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 ex) { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
return Double.valueOf(json); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (NumberFormatException ex2) { |
|
|
|
|
|
|
|
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; |
|
|
|
|