如何使用Java Streams将对象数组转换为指定格式的JSON结构
Java Streams实现对象数组转指定JSON结构方案
你的原有写法仅提取了所有roleName为一维列表,没有按name字段分组聚合,也没有生成嵌套结构,所以不符合需求。以下是可直接运行的实现方案:
首先约定你的对象对应实体类结构如下:
class RoleLevel { private String roleName; private String name; // 构造方法、setter略 public String getRoleName() { return roleName; } public String getName() { return name; } }
方案1:分两步处理(可读性更高)
第一步:按name字段分组,收集同组的roleName为列表
import java.util.stream.Collectors; // 按name分组聚合role Map<String, List<String>> nameToRolesMap = roleLevels.stream() // 可选:过滤空值避免空指针 .filter(rl -> rl.getName() != null && rl.getRoleName() != null) .collect(Collectors.groupingBy( RoleLevel::getName, Collectors.mapping(RoleLevel::getRoleName, Collectors.toList()) ));
第二步:封装为目标嵌套结构,再序列化为JSON
import com.fasterxml.jackson.databind.ObjectMapper; // 构造目标嵌套结构 Map<String, Map<String, List<String>>> resultMap = nameToRolesMap.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> Collections.singletonMap("role", entry.getValue()) )); // 序列化为格式化JSON字符串(需要引入jackson-databind依赖) ObjectMapper objectMapper = new ObjectMapper(); String jsonResult = objectMapper.writerWithDefaultPrettyPrinter() .writeValueAsString(resultMap);
方案2:一步流式处理(写法更简洁)
直接在分组时通过collectingAndThen完成嵌套结构封装:
Map<String, Map<String, List<String>>> resultMap = roleLevels.stream() .filter(rl -> rl.getName() != null && rl.getRoleName() != null) .collect(Collectors.groupingBy( RoleLevel::getName, Collectors.collectingAndThen( Collectors.mapping(RoleLevel::getRoleName, Collectors.toList()), roleList -> Collections.singletonMap("role", roleList) ) )); // 序列化JSON逻辑和方案1完全一致
最终输出的jsonResult就是你需要的目标JSON结构。
内容的提问来源于stack exchange,提问作者naveen
相关产品推荐
相关产品推荐

