POJO序列化JSON时如何将驼峰命名的key转换为蛇形命名?
问题根因
你当前标注的@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)仅作用于TimeSeries类的内部字段,无法生效于上层Supply类的timeSeries成员属性,因此该字段序列化后仍然保留小驼峰命名。
可行解决方案(仅需修改测试文件,无需改动原POJO)
方案1:修改测试使用的ObjectMapper全局命名策略
直接为你测试代码里用到的ObjectMapper实例配置全局蛇形命名规则,所有字段序列化时都会自动转蛇形:
// 仅在测试代码里新增这一行配置即可 mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); String jsonDataResponse = mapper.writeValueAsString(dataResponse); stubFor(WireMock.get(urlEqualTo("/someUrl")) .willReturn(aResponse() .withBody(jsonDataResponse)));
如果担心全局配置影响其他测试逻辑,可以在当前测试块单独实例化一个专属的ObjectMapper使用即可。
方案2:直接使用WireMock的JSON DSL构造响应体
跳过POJO序列化步骤,直接按预期格式构造JSON,更灵活适配桩化场景的定制需求:
stubFor(WireMock.get(urlEqualTo("/someUrl")) .willReturn(aResponse() .withHeader("Content-Type", "application/json") .withBody(JsonBody.json( Map.of( "supply", Map.of( "time_series", List.of( Map.of("date", "2021-11-16") ) ) ) ))));
方案3:序列化后手动替换键名(临时应急用)
如果不想改动Mapper配置也不想重构构造逻辑,可以对序列化后的字符串做一次替换:
String jsonDataResponse = mapper.writeValueAsString(dataResponse) .replace("\"timeSeries\"", "\"time_series\"");
该方案仅适合当前场景只有一处timeSeries键需要修改的情况,避免误替换其他内容。
内容的提问来源于stack exchange,提问作者Ulukbek Abylbekov
相关产品推荐
相关产品推荐

