controller返回已经排序的json数据,前端遍历时却顺序错乱
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
我用的是ssm框架,mybatis框架返回不固定对象时,resultType需要写成 java.util.Map
,对应的接受类为List<Map<String, Object>>
尽管sql语句里已经排序了,但是查询出来之后顺序早已乱掉。
下面我通过两个方法实现了对返回结果的排序,因为这个需求是一维数组和二维数组都要排序。
一个重要的地方就是不要返回map,因为返回的map无论是HashMap还是TreeMap,前端拿到之后都是无序的。
The first step
controller代码
@RequestMapping("/address")
@ResponseBody
public ResponseMessage showPlaceStatisticsTable(
@RequestBody ShowPlaceTableQueryParam showPlaceQueryParam, HttpSession session){
List<Map<String, Object>> maps = statisticsService.showPlaceTableQuery(showPlaceQueryParam);//调用mybatis的mapper.xml里的查询方法
maps = MapKeyComparator(maps);对返回的list里的每一个map根据key进行排序,返回结果是一个无序的list,但是list里的map里的key是有序的。
List<List<MapChangeList>> lists = mapChangeToList(maps);
message.setData(lists);
message.setCode(ResponseConstants.OK);
message.setMsg("查询成功");
return message;
}
Second steps
编写MapKeyComparator
方法
/**
* 表格统计数据省份比较器
*/
public List<Map<String,Object>> MapKeyComparator(List<Map<String,Object>> maps){
Map<String, Integer> compare = new TreeMap<>();//用来对应传入参数`maps`里的每一个key对应的数字
compare.put("YEAR",1);
compare.put("MONTH",1);
compare.put("地点和时间",1);
compare.put("合计",2);
compare.put("TOTAL",2);
compare.put("北京市",3);
compare.put("天津市",4);
compare.put("河北",5);
compare.put("山西",6);
compare.put("内蒙古自治区",7);
compare.put("辽宁",8);
compare.put("吉林",9);
compare.put("黑龙江",10);
compare.put("上海市",11);
compare.put("江苏",12);
compare.put("浙江",13);
compare.put("安徽",14);
compare.put("福建",15);
compare.put("江西",16);
compare.put("山东",17);
compare.put("河南",18);
compare.put("湖北",19);
compare.put("湖南",20);
compare.put("广东",21);
compare.put("广西壮族自治区",22);
compare.put("海南",23);
compare.put("重庆市",24);
compare.put("四川",25);
compare.put("贵州",26);
compare.put("云南",27);
compare.put("西藏自治区",28);
compare.put("陕西",29);
compare.put("甘肃",30);
compare.put("青海",31);
compare.put("宁夏回族自治区",32);
compare.put("新疆维吾尔自治区",33);
compare.put("台湾",34);
compare.put("香港",35);
compare.put("澳门",36);
List<Map<String,Object>> stringObjectMapFirst = new ArrayList<>();
for (int i = 0; i < maps.size(); i++) {
Map<String, Object> stringObjectMap = new TreeMap<String, Object>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
Integer integer = compare.get(o1);
Integer integer1 = compare.get(o2);
if(null == integer){//预防获取不到key值
integer = 0;
}
if(null == integer1){
integer1 = 0;
}
return integer.compareTo(integer1);//降序排列
}
});
stringObjectMap.putAll(maps.get(i));
stringObjectMapFirst.add(stringObjectMap);
}
return stringObjectMapFirst;
}
Third steps
需要先将List<Map<String,Object>>
类型转变为List<List<MapChangeList>>
类型,因为map类型传到前端永远是无序的,只有list才是有序的。所以此方法有两个功能,1.将List<Map<String,Object>>
类型转变为List<List<MapChangeList>>
类型,2.将list排序。//MapChangeList类里只有两个属性,一个string类型,一个object类型,会贴在最后。
/**
* map转list,并排序
*/
public List<List<MapChangeList>> mapChangeToList(List<Map<String,Object>> maps){
List<List<MapChangeList>> lists = new ArrayList<>();
for (int i = 0; i < maps.size(); i++) {
List<MapChangeList> mapChangeLists = new ArrayList<>();
Map<String, Object> stringObjectMap = maps.get(i);
Iterator it = stringObjectMap.keySet().iterator();
while (it.hasNext()) {
MapChangeList mapChangeList = new MapChangeList();
String key = it.next().toString();
Object o = stringObjectMap.get(key);
mapChangeList.setKey(key);
mapChangeList.setValue(o);
mapChangeLists.add(mapChangeList);
}
lists.add(mapChangeLists);
}
//上方代码已完转换list,下方是对二维list进行排序
Collections.sort(lists, new Comparator<List<MapChangeList>>() {
@Override
public int compare(List<MapChangeList> o1, List<MapChangeList> o2) {
return o1.get(0).getValue().hashCode() - o2.get(0).getValue().hashCode();//这里是因为由于第一个方法将所有的月份或者年份都排到了下标为0的位置,所以直接比对哈希值即可了。。。。具体逻辑具体分析嘛
}
});
return lists;
}
辅助类 MapChangeList :
public class MapChangeList implements Serializable{
private static final long serialVersionUID = 7756822135607139301L;
private String key;
private Object value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
有更好的处理此错误的方式的朋友还请留下链接参考,谢谢
17点14分
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
3 个月前
8c391e04
6 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)