有这么一个需求,将一个二维的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));
}
}
}