1、关于将数据库查询的参数转换为不同格式返回
第一个:
因为我返回给前端的数据都是一条一条的
“data”: {
“person_type”: [
“刑满释放人员”,
“吸毒人员”,
“社区矫正人员”,
“肇事肇祸及严重精神障碍患者”,
“艾滋病危险人员”,
“刑满释放人员”,
“吸毒人员”,
“社区矫正人员”,
“肇事肇祸及严重精神障碍患者”,
“艾滋病危险人员”
],
“name”: [“少儿”,“少儿”,“少儿”,“少儿”,“少儿”,“青年”,“青年”,“青年”,“青年”,“青年”],
“sum”: [1,1,1,1,1,1,1,1,1,1]
}
但是前端需要的参数格式是
data": {
“person_type”: [“刑满释放人员”,“吸毒人员”,“社区矫正人员”, “肇事肇祸及严重精神障碍患者”,
“艾滋病危险人员”
],
“name”: [“少儿”,“青年”],
“sum”: [
[1,1,1,1,1],
[1,1,1,1,1]
]
}
于是我开始再后端处理数据
//查询出来的结果 存放到一个List中
List<Map<String, Object>> userBindAndCountByType =
comprehensiveOtherPersonMapper.getUserBindAndCountByType(type, keys);
//分别给三个查询出的参数 建立一个数组
List<String> personTypes = new ArrayList<>();
List<String> names = new ArrayList<>();
List<List<Integer>> sums = new ArrayList<>();
```javascript
//遍历循环这个查询的List
for (Map<String, Object> result : userBindAndCountByType) {
/*
从查询的list中通过key来获取对应的值
*/
String personType = (String) result.get("person_type");
String name = (String) result.get("name");
Object count = result.get("sum");
/*因为获取的value是Object类型,所以需要转格式,转成Integer类型(sum是一个数字)*/
Integer sumcount = Integer.parseInt(count.toString());
//先判断这个personTypes 中是否有personType的值,如果没有就添加进去,这一步是为了去重*/
if (!personTypes.contains(personType)) {
personTypes.add(personType);
}
//再判断这个names中是不是又name的值,如果没有就添加,也是为了去重
if (!names.contains(name)) {
names.add(name);
}
// 根据 personType 和 name 获取索引
int personTypeIndex = personTypes.indexOf(personType);
int nameIndex = names.indexOf(name);
// 将 count 值添加到相应的索引位置
if (sums.size() <= nameIndex) {
List<Integer> sum = new ArrayList<>();
sum.add(sumcount);
sums.add(sum);
} else {
List<Integer> sum = sums.get(nameIndex);
if (sum.size() <= personTypeIndex) {
sum.add(sumcount);
} else {
sum.set(personTypeIndex, sum.get(personTypeIndex) + sumcount);
}
}
}
// 构建最终结果的字典
Map<String, Object> finalResult = new HashMap<>();
finalResult.put("person_type", personTypes);
finalResult.put("name", names);
finalResult.put("sum", sums);
return finalResult;
第二个:
这是一个list返回的数据
{
"A99": 0,
"deptName": "铁西区",
"A01": 0,
"A02": 0,
"A03": 0,
"A04": 0,
"A05": 0,
"A06": 0,
"A07": 0,
"deptId": 373,
"deptType": "sys_dept_type_17"
}
这是我要返回给前端的格式,一开始绞尽脑汁也没想出来到底怎么才能转换成这种,于是去问了大哥
[
{
"A99": 0,
"deptName": "铁西区",
valueList:[{"name": '血液感染',value:0},
{"name": '血液感染',value:0},
{"name": '血液感染',value:0},
{"name": '血液感染',value:0},
{"name": '血液感染',value:0},
]
"deptId": 373,
"deptType": "sys_dept_type_17"
}
]
大哥给我的回复是
List<Map<String,Object>> resultList;
Map<String,Object> map;
for(list)->i,item
map.put("deptName",list.get(i).get("deptName"));
List<Map<String,Object>> list2;
Map<String,Object> map2;
for->item
map2.put("name",key);
map2.put("value",item.get(key));
list2.add(map2)
map.put("valueList",list2);
resultList.add(map);
于是 我最终敲定的版本是
Map<String, Object> maps = new HashMap<>();
List<Map<String,Object>> resultList = new ArrayList<>();
for (Map<String, Object> map1 : safetyInvolvedCountByCaseNature) {
String dept = (String) map1.get("deptName");
List<Map<String,Object>> list2 = new ArrayList<>();
for (Map.Entry<String, Object> map3 : map1.entrySet()) {
Object key = map3.getKey();
if (!key.equals("deptName") && !key.equals("deptId") && !key.equals("deptType")) {
Map<String,Object> map2 = new HashMap<>(); // 在这里创建新的 map2 对象
map2.put("name", key);
map2.put("value", map3.getValue());
list2.add(map2);
}
}
System.out.println(list2);
maps.put("deptName", dept);
maps.put("list", list2);
resultList.add(maps);
maps = new HashMap<>(); // 在这里创建新的 maps 对象
}
return resultList;
遇到的问题在于最后一个maps = new HashMap<>()
遇到了这样的问题
[{name=不详, value=0}, {name=不详, value=0}, {name=不详, value=0}, {name=不详, value=0}, {name=不详, value=0}, {name=不详, value=0}, {name=不详, value=0}, {name=不详, value=0}]
最后通过将Map<String, Object> maps = new HashMap<>();的创建放在外层循环的最后一行,确保每次循环迭代时都会创建一个新的 maps 对象,从而避免了重复引用问题。这样,每次循环迭代时都会创建一个新的maps对象,并将其添加到resultList中。