Я немного повозился и создал следующий класс:
class JsonNumberParser {
private final String json;
private final int length;
private final List<Integer> result;
private final char[] buffer = new char[64];
private int bufferIndex = 0;
public JsonNumberParser(String json) {
this.json = json;
length = json.length();
result = new ArrayList<>(length);
}
public List<Integer> parse() {
char c;
for (int i = 0; i < length; i++) {
c = json.charAt(i);
// if we encounter a comma and the buffer contains data
if (c == ',' && bufferIndex > 0) {
// then we add the new number
addBuffer();
// and reset the buffer
while (bufferIndex > 0) {
buffer[--bufferIndex] = '\0';
}
} else if (c == '-' || (c >= '0' && c <= '9')) {
buffer[bufferIndex++] = c;
}
}
// add the last possible number, if there was any
if (bufferIndex > 0) {
addBuffer();
}
// return the result
return result;
}
private void addBuffer() {
result.add(Integer.valueOf(new String(buffer, 0, bufferIndex)));
}
}
Конечно, вы можете поместить все это в один метод, но тогда вы получите некоторое дублирование кода относительно добавления Integers
.
Способ работы этого синтаксического анализатора заключается в том, что он использует буфер для буферизации цифр, пока мы не встретим запятую. Таким образом, мы можем иметь большие числа (до 64 цифр в этой реализации) в json.
Вы можете использовать это, как показано в следующем примере:
List<Integer> integers = new JsonNumberParser(jsonRequest).parse();
Что касается производительности, я ожидаю, что это будет намного быстрее, чем при использовании Regex
. Но, к сожалению, у меня нет настройки бенчмарка под рукой
Имейте в виду, что это не валидатор, поэтому строка json: [[,,,]}]
просто выдаст пустое List
(Возможно) Улучшения : Я подумал и искал немного больше. Вот некоторые улучшения, которые могут улучшить производительность:
1. Можно просто сбросить buffer
, присвоив ему new int[64]
, что приведет к большему количеству мусора, но в итоге может быть быстрее.
2. Синтаксический анализ числа можно улучшить, используя предложенный ответ здесь . Который использует просто старую математику и не создает строк и разбирает целые числа.