Closed goubo closed 6 years ago
对错误的最大容忍性和严格性,这两个目前是难以兼容的。
可以考虑实现一个严格模式,一个兼容模式,两个开关。 另外,题主想要的功能,实际上是json schema+validation的功能,也是fastjson暂缺的。
明白了~先手写了一个验证
public static boolean checkJson4Number(String string) {
AtomicBoolean flag = new AtomicBoolean(true);
String josnString = string.trim();
if (josnString.charAt(0) == '{') {
JSONObject jsonObject = JSON.parseObject(josnString);
jsonObject.values().forEach(o -> {
if (!flag.get()) return;
if (o instanceof Number) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(o.toString());
if (!isNum.matches()) {
flag.set(false);
return;
}
}
if (o instanceof JSONObject) {
flag.set(checkJson4Number(o.toString()));
if (!flag.get())
return;
}
if (o instanceof JSONArray) {
flag.set(checkJson4Number(o.toString()));
if (!flag.get())
return;
}
});
} else if (josnString.charAt(0) == '[') {
JSONArray jsonArray = JSON.parseArray(josnString);
jsonArray.forEach(oa -> {
if (!flag.get()) return;
if (oa instanceof JSONObject) {
flag.set(checkJson4Number(oa.toString()));
if (!flag.get())
return;
}
if (oa instanceof JSONArray) {
flag.set(checkJson4Number(oa.toString()));
if (!flag.get())
return;
}
});
}
return flag.get();
}
系统设计是没有小数的,直接filterHandler统一处理
if (!StringUtil.isEmpty(routingContext.getBodyAsString()) && !StringUtil.checkJson4Number(routingContext.getBodyAsString())) {
Result result = new Result(ResultEnum.PARAMFORMALERROR, "系统未定义浮点参数。");
logger.info("请求完成 id:" + requestId + "任何参数不应该有小数");
routingContext.response().putHeader("content-type", "application/json; charset=utf-8").setStatusCode(result.getHttpStatus()).end(result.toString());
return;
}
concurrentLimit的类型是Integer
输出结果是2
项目中我直接转换类型了,希望能拿到报错,来判断用户入会的数字格式。