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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:15:02