alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.74k stars 6.5k forks source link

数字格式转换时如何关闭自动类型适配 #1672

Closed goubo closed 6 years ago

goubo commented 6 years ago
 public static void main(String[] args) throws IOException {
        String string = "{\"concurrentLimit\": 2.2356 }";
        EdgeGroup edgeGroup = EdgeGroup.fromJsonString(string);
        System.out.println(edgeGroup.getConcurrentLimit());
    }

concurrentLimit的类型是Integer

输出结果是2

项目中我直接转换类型了,希望能拿到报错,来判断用户入会的数字格式。

kimmking commented 6 years ago

对错误的最大容忍性和严格性,这两个目前是难以兼容的。

可以考虑实现一个严格模式,一个兼容模式,两个开关。 另外,题主想要的功能,实际上是json schema+validation的功能,也是fastjson暂缺的。

goubo commented 6 years ago

明白了~先手写了一个验证

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;
        }