You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rest Assured如何从无名称数组的JSON响应中生成Map<time,count>结构?

优化实现方案

原有实现存在潜在风险:如果JSON数组中某条记录缺失_time或count字段,单独提取的两个列表长度会不一致,导致时间与计数的对应关系错位,无法保证数据准确性。


方案1:直接遍历JSON数组元素(基于RestAssured JsonPath,无需额外引入依赖)

无需额外定义DTO类,直接读取整个数组后通过流式API组装Map,代码更简洁且数据对应关系更可靠:

JsonPath js = new JsonPath(res.asString());
// 直接读取根路径下的整个JSON数组
List<Map<String, Object>> recordList = js.getList("$");
// 流式遍历组装为保留原始顺序的LinkedHashMap
Map<String, Float> timeCountMap = recordList.stream()
    .collect(Collectors.toMap(
        item -> (String) item.get("_time"),
        item -> ((Number) item.get("count")).floatValue(),
        // 重复时间键的合并逻辑,可根据业务调整,比如重复时抛出异常
        (oldVal, newVal) -> newVal,
        LinkedHashMap::new
    ));

优势:

  • 每条记录的_time和count严格绑定,从根源避免对应错位问题
  • 省去手动维护双迭代器的冗余逻辑,代码可读性更高
  • 支持自定义重复时间键的冲突处理规则,适配不同业务场景

方案2:基于Jackson实现(适用于项目已引入Jackson依赖的场景)

如果项目本身已经使用Jackson做JSON序列化,也可以用Jackson处理,性能更优,适合返回体规模较大的场景:

ObjectMapper objectMapper = new ObjectMapper();
List<JsonNode> recordList = objectMapper.readValue(res.asString(), new TypeReference<List<JsonNode>>() {});
Map<String, Float> timeCountMap = recordList.stream()
    .collect(Collectors.toMap(
        node -> node.get("_time").asText(),
        node -> node.get("count").floatValue(),
        (oldVal, newVal) -> newVal,
        LinkedHashMap::new
    ));

内容的提问来源于stack exchange,提问作者anamika pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:48:00