如何使用Java 8 Stream将嵌套JSON扁平化并映射为数据库实体类
实现方案
前置说明
首先你需要先将待解析的JSON字符串反序列化为RechargeResponse类实例,可借助Jackson/Gson等JSON序列化工具完成。
另外需要提前给RechargePlanEntity重写equals和hashCode方法,按照你的去重规则定义(比如基于operatorId+circleId组合判断重复),保证HashSet可以正确去重。
核心转换代码(Java 8 Stream实现)
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Set; import java.util.stream.Collectors; // 1. 第一步:JSON反序列化为RechargeResponse对象 ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = "你的扁平化JSON字符串"; RechargeResponse rechargeResponse = objectMapper.readValue(jsonStr, RechargeResponse.class); // 2. 第二步:使用Stream+flatMap完成嵌套结构扁平化、实体映射 Set<RechargePlanEntity> planEntities = rechargeResponse.getPayload().stream() // flatMap展开每个运营商下的所有套餐圈数据 .flatMap(operator -> operator.getCircleWisePlanLists().stream() // 将运营商信息和单条圈信息组合为一个RechargePlanEntity实体 .map(circle -> { RechargePlanEntity entity = new RechargePlanEntity(); entity.setOperatorName(operator.getOperatorName()); entity.setOperatorId(operator.getOperatorId()); entity.setCircleName(circle.getCircleName()); entity.setCircleId(circle.getCircleId()); return entity; }) ) // 直接收集为HashSet完成去重 .collect(Collectors.toSet()); // 3. 第三步:批量入库,以Spring Data JPA为例 rechargePlanRepository.saveAll(planEntities);
实现逻辑说明
- 外层遍历
RechargeResponse的payload中所有OperatorWiseCircles对象 - 通过
flatMap将每个运营商对应的CircleWisePlan列表展开为单独的元素流,替代传统嵌套for循环 - 内层
map将运营商属性和圈属性组合为最终的RechargePlanEntity实体,整个过程仅一次遍历即可完成,没有额外中间集合开销,性能较高
注意事项
- 如果你的JSON字段名和模型类字段名不匹配,需要给模型类加对应的序列化注解(比如Jackson的
@JsonProperty)保证反序列化正常 - 重写
RechargePlanEntity的equals和hashCode时不要包含自增主键id,否则会导致去重逻辑失效
内容的提问来源于stack exchange,提问作者MukthyarStack
相关产品推荐
相关产品推荐

