【发布时间】:2019-01-08 16:54:26
【问题描述】:
我的应用程序期望 json 请求包含一个(可能是多维的)未排序数组,其中只有整数和可能的空值。类似[6, 2, [4, 3],[[[5], nil], 1]]
由于我无法解析无效的 json,我不得不求助于使用正则表达式来完成脏活,而且速度非常慢。
例如上面的测试用例大约需要 1.xx seconds 来完成,而带有 10000 元素的平面数组需要少于 1 second
目前我将请求正文作为字符串获取,然后应用正则表达式。
static ArrayList<Integer> getIntegers(String requestData) {
// Apply a regex to the request body
final String regularExpression = "([^\\d])+";
// to get all the nested arrays
Pattern pattern = Pattern.compile(regularExpression);
String[] results = pattern.split(requestData);
ArrayList<Integer> numbers = new ArrayList<>();
// loop over the results and add to numbers array
for (String result : results) {
try {
numbers.add(Integer.valueOf(result));
} catch (NumberFormatException e) {
// Catch and skip any non integers
}
}
return numbers;
}
}
无论如何我可以加快速度,或者是否有性能更好的替代方法?如果我需要处理一个包含 20000 个元素的多维数组,那就太慢了。
【问题讨论】:
-
好问题!!如果这是 javascript,我会要求您尝试 .flatmap(Infinite) 然后检查。也许这会给出一些想法。
-
@AdityaGupta 感谢您的提示!一定会研究您对一些想法的建议
-
您为什么要尝试解析无效的 JSON 而不是简单地拒绝此类请求?
-
小注,正则表达式
[^\d]等于\D,两者都将匹配除数字之外的所有内容 -
@krankit 如果只是
nil,则使用字符串替换将它们替换为null。您最终会得到可以使用任何 JSON 解析器解析的有效 JSON。
标签: json regex string performance java-8