繁体   English   中英

如何使用 Java 8 Stream 将嵌套的 json 展平为 map?

[英]How to flatten nested json to map with entity using Java 8 Stream?

对于 RechargeResponse Model,我有一个看起来像这样的结构:

public class RechargeResponse {
    private String code;
    private String status;
    private Set<OperatorWiseCircles> payload; 
   // setter and getters
}

这是 OperatorWiseCircles Model

public class OperatorWiseCircles {
    private String operatorName;
    private String operatorId;
    private List<CircleWisePlan> circleWisePlanLists;
//setter and getters
}

CircleWisePlan Model class

public class CircleWisePlan {
    private String circleName;
    private String circleId;
}

下面是我们需要扁平化的样本 json。

{
  "code": 200,
  "status": "SUCCESS",
  "payload": [
    {
      "operatorName": "VODAFONE",
      "operatorId": "VF",
      "circleWisePlanLists": [
        {
          "circleName": "C1",
          "circleId": "1"
        },
        {
          "circleName": "C2",
          "circleId": "2"
        }
      ]
    }
  ]
}

我希望它是扁平的,map 到实体 object,这样我就可以将所有这些迭代添加到 Hashset 并将它们全部保存到 DB,我想使用 java8 stream 来完成它。我怎样才能有效地做到这一点。 我没有找到正确的示例来解析嵌套的 json 值并使用 map/flatmap 为其创建实体。 结果应该像

例如:["VODAFONE","VF","C1", "1"]---> ENTRY1 ["VODAFONE","VF","C2", "2"] ---> ENTRY2

@Entity
public class RechargePlanEntity extends Audit<String>{
    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name="operator_name")
    private String operatorName;

    @Column(name="operator_id")
    private String operatorId;

    @Column(name="circle_name")
    private String circleName;

    @Column(name="circle_id")
    private String circleId;       

}

事实是我确定有任何简单的方法可以做到这一点,但是您可以按照这样的方式进行操作,

在此示例中,我创建了实用程序 class 到 map OperatorWiseCircles class 到List<RechargePlanEntity>

public class Main {
    public static void main(String[] args) throws IOException {

        String s = "{\"code\":200,\"status\":\"SUCCESS\",\"payload\":[{\"operatorName\":\"VODAFONE\",\"operatorId\":\"VF\",\"circleWisePlanLists\":[{\"circleName\":\"C1\",\"circleId\":\"1\"},{\"circleName\":\"C2\",\"circleId\":\"2\"}]}]}";

        ObjectMapper om = new ObjectMapper();
        RechargeResponse response = om.readValue(s, RechargeResponse.class);

        List<RechargePlanEntity> collection = response.getPayload()
                .stream()
                .map(MapUtil::toEntity)
                .flatMap(Collection::stream)
                .collect(Collectors.toList());

        System.out.println(collection);
    }
}

@Getter
@Setter
@ToString
class RechargePlanEntity {
    private Long id;
    private String operatorName;
    private String operatorId;
    private String circleName;
    private String circleId;
}

@Getter
@Setter
class RechargeResponse {
    private String code;
    private String status;
    private Set<OperatorWiseCircles> payload;
}

@Getter
@Setter
class OperatorWiseCircles {
    private String operatorName;
    private String operatorId;
    private List<CircleWisePlan> circleWisePlanLists;
}

@Getter
@Setter
class CircleWisePlan {
    private String circleName;
    private String circleId;
}

final class MapUtil {

    public static List<RechargePlanEntity> toEntity(OperatorWiseCircles in) {
        return in.getCircleWisePlanLists()
                .stream()
                .map(MapUtil::map)
                .peek(out -> map(in, out))
                .collect(Collectors.toList());
    }

    private static RechargePlanEntity map(CircleWisePlan in) {
        RechargePlanEntity out = new RechargePlanEntity();
        out.setCircleId(in.getCircleId());
        out.setCircleName(in.getCircleName());
        return out;
    }

    private static void map(OperatorWiseCircles in, RechargePlanEntity out) {
        out.setOperatorId(in.getOperatorId());
        out.setOperatorName(in.getOperatorName());
    }
}

没有 id 的实体可以从RechargeResponse model 创建,前提是该实体具有全参数构造函数:

RechargeResponse modelFromJson = ... //

List<RechargePlanEntity> entities = modelFromJson.getPayload()
        .stream() // Stream<OperatorWiseCircles>
        .flatMap(ows -> ows.getCircleWisePlanLists()
                           .stream() // Stream<CircleWisePlan>
                           .map(cwp -> new RechargePlanEntity(
                               null, // instead of id
                               ows.getOperatorName(),
                               ows.getOperatorId(),
                               cwp.getCircleName(),
                               cwp.getCircleId()
                           )) // Stream<RechargePlanEntity>
        ) // Stream<RechargePlanEntity>
        .collect(Collectors.toList());

或者,如果构建器在实体 class 中实现(例如使用 Lombok 的@Builder注释),则此转换可能如下所示:

List<RechargePlanEntity> entities = modelFromJson.getPayload()
        .stream() // Stream<OperatorWiseCircles>
        .flatMap(ows -> ows.getCircleWisePlanLists()
                           .stream() // Stream<CircleWisePlan>
                           .map(cwp -> RechargePlanEntity.builder()
                               .operatorName(ows.getOperatorName())
                               .operatorId(ows.getOperatorId())
                               .circleName(cwp.getCircleName())
                               .circleId(cwp.getCircleId())
                               .build()
                           ) // Stream<RechargePlanEntity>
        ) // Stream<RechargePlanEntity>
        .collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM