如何从WebTau响应体Map<String,?>中正确获取Long类型值
WebTau JSON响应反序列化问题解答
数值超过Integer范围时的解析行为
WebTau默认使用Jackson实现JSON反序列化,整数值会根据实际大小自动匹配适配的Java数值类型,不会出现溢出截断的问题:
- 数值落在
Integer取值范围(-2147483648 ~ 2147483647)内时,会被解析为Integer实例,也就是你当前日志输出id is Integer的场景 - 数值超过
Integer范围但未超出Long取值上限时,会自动升级解析为Long实例,会命中你代码中instanceof Long的判断分支 - 数值超过
Long最大值时,会自动解析为BigInteger类型存储 - 带小数位的数值默认解析为
Double,有高精度需求的场景下会解析为BigDecimal
JSON数字类型的识别方式
JSON规范本身没有定义整数长度的差异化类型,传输层所有数字都是纯文本字符,不会携带“BIGINT/INT”这类服务端侧的类型元数据,最终生成的Java类型完全由客户端反序列化逻辑决定。
你当前代码里写的instanceof类型判断,就可以直接获取到WebTau解析后的实际值类型,不需要额外做特殊识别。
覆写指定字段反序列化类型的方法
有两种成熟的实现方案,按需选择即可:
- 单接口定制:直接在响应处理的lambda表达式中手动做类型转换,灵活度最高,适合只需要调整个别接口字段类型的场景,示例代码如下:
Map<String, ?> approvalMap = WebTauDsl.http.post( callUrl, restCallHeader, restCallBody, ((header, body) -> { Map<String, Object> convertedBody = new HashMap<>(body); Object rawId = convertedBody.get("id"); // 强制将id字段转换为Long类型,忽略默认的范围适配逻辑 if (rawId instanceof Number) { convertedBody.put("id", ((Number) rawId).longValue()); } return convertedBody; }) ); // 后续取值可以直接强转Long,不需要再判断Integer分支 Long approvalId = (Long) approvalMap.get("id");
- 全局规则定制:如果要让所有接口的指定字段都统一按固定类型反序列化,可以自定义WebTau的HTTP配置,注册自定义的Jackson反序列化模块,给对应字段名/JSON路径的字段绑定固定反序列化类型,一次配置全局生效。
补充提示:你贴的示例代码存在变量名不一致的笔误,定义的Map变量名为
approvalMap,后续做类型判断时写的是accessApprovalMap,实际运行会触发编译错误,注意统一变量名。
内容的提问来源于stack exchange,提问作者will
相关产品推荐
相关产品推荐

