如何将Sonar API返回的List<Map<String,Object>>转换为指定键值结构
问题描述
我从Sonar搜索API获取到格式为List<Map<String,Object>>的响应数据:
[ { "key": "KY1", "name": "key1", "qualifier": "KYK", "visibility": "public", "lastAnalysisDate": "2022-09-10T08:01:13+0000", "revision": "bidvbu5u59" }, { "key": "KY2", "name": "key2", "qualifier": "KYK", "visibility": "public", "lastAnalysisDate": "2023-02-26T09:53:08+0000", "revision": "bibnodsfnfbidvbu5u59" }, { "key": "KY3", "name": "key3", "qualifier": "KYK", "visibility": "public", "lastAnalysisDate": "2023-02-07T14:07:31+0000", "revision": "bibnodsfnfbidvbu5u59" } ]
同时有一个从数据库动态获取的键名列表(条目会随数据库变化),示例如下:
List<String> keys = new ArrayList<>(); keys.add("key"); keys.add("name");
需要根据该列表从响应数据中提取对应字段,转换为如下格式的新List<Map<String,Object>>:
[ { "key": "KY1", "value": "key1" }, { "key": "KY2", "value": "key2" }, { "key": "KY3", "value": "key3" } ]
请问如何实现这一过滤与转换操作?
实现方案
方式一:普通循环遍历(兼容低版本Java)
直接遍历原始数据列表,对每个Map提取指定键对应的字段,组装成新的Map后加入结果列表。同时处理字段列表长度不足、原始Map缺失指定键的容错场景。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class SonarDataConverter { public static List<Map<String, Object>> convertSonarData(List<Map<String, Object>> originalData, List<String> fieldKeys) { List<Map<String, Object>> result = new ArrayList<>(); // 确保字段列表至少包含两个元素,对应新Map的key和value来源 if (fieldKeys == null || fieldKeys.size() < 2) { return result; } String keyField = fieldKeys.get(0); String valueField = fieldKeys.get(1); for (Map<String, Object> item : originalData) { Map<String, Object> newItem = new HashMap<>(); // 提取字段,缺失时设为null newItem.put("key", item.getOrDefault(keyField, null)); newItem.put("value", item.getOrDefault(valueField, null)); result.add(newItem); } return result; } // 测试示例 public static void main(String[] args) { // 模拟Sonar API返回的原始数据 List<Map<String, Object>> originalData = new ArrayList<>(); Map<String, Object> item1 = new HashMap<>(); item1.put("key", "KY1"); item1.put("name", "key1"); item1.put("qualifier", "KYK"); originalData.add(item1); Map<String, Object> item2 = new HashMap<>(); item2.put("key", "KY2"); item2.put("name", "key2"); item2.put("qualifier", "KYK"); originalData.add(item2); Map<String, Object> item3 = new HashMap<>(); item3.put("key", "KY3"); item3.put("name", "key3"); item3.put("qualifier", "KYK"); originalData.add(item3); // 模拟数据库获取的键名列表 List<String> keys = new ArrayList<>(); keys.add("key"); keys.add("name"); // 执行转换 List<Map<String, Object>> convertedData = convertSonarData(originalData, keys); // 输出结果 convertedData.forEach(System.out::println); } }
方式二:Java Stream流式处理(Java 8+)
利用Stream API简化遍历和转换逻辑,代码更简洁:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class SonarDataStreamConverter { public static List<Map<String, Object>> convertSonarDataWithStream(List<Map<String, Object>> originalData, List<String> fieldKeys) { if (fieldKeys == null || fieldKeys.size() < 2) { return new ArrayList<>(); } String keyField = fieldKeys.get(0); String valueField = fieldKeys.get(1); return originalData.stream() .map(item -> { Map<String, Object> newItem = new HashMap<>(); newItem.put("key", item.getOrDefault(keyField, null)); newItem.put("value", item.getOrDefault(valueField, null)); return newItem; }) .collect(Collectors.toList()); } // 测试示例同方式一,此处省略 }
关键说明
- 兼容性:普通循环支持所有Java版本,Stream方式需要Java 8及以上;
- 容错处理:通过
getOrDefault避免原始Map缺失指定键时抛出空指针异常; - 动态适配:只要数据库返回的
fieldKeys列表包含至少两个元素,就能自动对应新Map的key和value字段,无需修改核心转换逻辑。
内容的提问来源于stack exchange,提问作者Kumar Shorav
相关产品推荐
相关产品推荐

