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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:43:23