java实现多层嵌套循环参数转换

有这么一个需求,将一个二维的json对象,根据一定的配置,转化成多维度嵌套的json。如下图所示:

这种的我姑且称之为参数嵌套转化算法。

下面进入正题----上代码

一步到位难度比较大,我才去两端式转换。

首先我现将原始报文转换为中间状态报文如下:

 中间状态报文是由原始报文根据不同层级的类别,按照父子节点进行配置递归运算后生成的结果。如下为递归模块的核心算法。

private void recursion(String parentTempltId, List<ModelManageResponseGroupConfig> tAiInterAttrDOList, Map<String, Object> paramMap,Map<String, Object> newMap, Map<String, Object> originMap) {
        for (int i = 0; i < tAiInterAttrDOList.size(); i++) {
            ModelManageResponseGroupConfig attrDO = tAiInterAttrDOList.get(i);

            if (!StringUtils.equals(String.valueOf(parentTempltId), String.valueOf(attrDO.getParentId()))) {
                continue;
            }
            String type = attrDO.getFieldType();
            if (FieldTypeConstant.STRING.equals(type)) {
                String value = paramMap.get(attrDO.getFieldName()) == null ? null : paramMap.get(attrDO.getFieldName()).toString();
                newMap.put(attrDO.getFieldNameTrsfm(), value);
            } else if (FieldTypeConstant.LIST.equals(type)) {
                List<Map<String, Object>> list = (List<Map<String, Object>>)paramMap.get(attrDO.getFieldName());
                List<Map<String, Object>> newList = (List<Map<String, Object>>)newMap.get(attrDO.getFieldNameTrsfm());
                if (null == newList) {
                    newList = new ArrayList<>();
                }
                if(list==null){
                    List<ModelManageResponseGroupConfig> modelManageResponseGroupConfigs = modelManageResponseGroupConfigMapper.selectModelManageResponseGroupConfigByGroupIdAndParentId(attrDO.getGroupId(),attrDO.getConfigId());
                    for (int j = 0;j < modelManageResponseGroupConfigs.size(); j++) {
                        Map<String, Object> tempMap = new HashMap<>();
                        Map<String, Object> childrenMap = BeanUtil.beanToMap(modelManageResponseGroupConfigs.get(j));
                        recursion(attrDO.getConfigId(), tAiInterAttrDOList, childrenMap, tempMap,originMap);
                        newList.add(tempMap);
                    }
                    newMap.put(attrDO.getFieldNameTrsfm(), newList);
                }
            } else if (FieldTypeConstant.MAP.equals(type)) {
                HashMap<String, Object> childMap = (HashMap<String, Object>)newMap.get(attrDO.getFieldNameTrsfm());
                if (null == childMap) {
                    childMap = new HashMap<String, Object>();
                    List<ModelManageResponseGroupConfig> modelManageResponseGroupConfigs = modelManageResponseGroupConfigMapper.selectModelManageResponseGroupConfigByGroupIdAndParentId(attrDO.getGroupId(),attrDO.getConfigId());
                    Map<String, Object> tempMap = new HashMap<>();
                    for (int j = 0;j < modelManageResponseGroupConfigs.size(); j++) {
                        ModelManageResponseGroupConfig tempModel = modelManageResponseGroupConfigs.get(j);
                        Map<String, Object> childrenMap = BeanUtil.beanToMap(modelManageResponseGroupConfigs.get(j));
                        tempMap.put(tempModel.getFieldName(),originMap.get(tempModel.getFieldName()));
                    }
                    recursion(attrDO.getConfigId(), modelManageResponseGroupConfigs, tempMap, childMap,originMap);
                }
                newMap.put(attrDO.getFieldNameTrsfm(), childMap);
            }
        }

    }

 数据库父子级表关联设计如下:

得到了中间结果后,根据中间结果进行二次递归,完成最终结果的输出。二次递归方法参考如下:

private static void recursionRsp(Map<String, Object> map, Map<String, Object> newMaps) {
        for (Object objEntry : map.entrySet()) {
            Map.Entry<String, Object> entry = (Map.Entry<String, Object>)objEntry;
            String key = entry.getKey();

            if (entry.getValue() instanceof Map) {
                Map<String, Object> newMap = (Map<String, Object>)entry.getValue();
                Map<String, Object> childMap = new HashMap<String, Object>();
                recursionRsp(newMap, childMap);
                newMaps.put(key, childMap);
            } else if (entry.getValue() instanceof List) {
                List oldLst = (List)entry.getValue();
                List<Object> newLst = (List<Object>)newMaps.get(key);
                if (null == newLst) {
                    newLst = new ArrayList<Object>();
                }
                for (Object obj : oldLst) {
                    Map<String, Object> newMap = (Map<String, Object>)obj;
                    Map<String, Object> childMap = new HashMap<String, Object>();
                    recursionRsp( newMap, childMap);
                    newLst.add(childMap);
                }
                newMaps.put(key, newLst);
            } else {
                newMaps.put(key, map.get(key));
            }
        }
    }

 源码资源传送门:java实现多层嵌套循环参数转换-Java文档类资源-CSDN下载多层嵌套循环参数转换数据库配置报文父子级结构java实现更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/YouShouRenSheng/85705836

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追风小勺年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值