controller返回已经排序的json数据,前端遍历时却顺序错乱

controller返回已经排序的json数据,前端遍历时却顺序错乱

  • mybatis框架返回不固定对象时,resultType需要写成 java.util.Map,对应的接受类为List>
  • 尽管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>类型,因为map类型传到前端永远是无序的,只有list才是有序的。所以此方法有两个功能,1.将List<Map<String,Object>>类型转变为List<List>类型,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;
        }
    
    }
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在控制器中返回 JSON 数据可以使用一些框架自带的方法,例如在 ASP.NET Core 中可以使用 `Json()` 或 `JsonResult()` 方法来返回 JSON 数据。在其他框架中也有类似的方法,例如在 Ruby on Rails 中可以使用 `render json: data` 来返回 JSON 数据。 ### 回答2: 在现代Web开发中,Controller是一个非常重要的组件,它被用于处理客户端请求并返回相关数据。在许多情况下,Controller简单地返回一个JSON格式的数据JSON是一种轻量级的数据交换格式,它的灵活性和易读性使得它成为了当前Web开发中最常用的数据格式之一。 Controller返回JSON数据这种方式非常常见,特别是在单页应用(SPA)中,因为在SPA中,数据的传输被更高效地处理,并且前端框架可以直接以JSON格式解析数据。但是,对于传统的多页应用程序,Controller也可以返回JSON数据,并与AJAX或XHR等JavaScript库配合使用。 Controller返回JSON数据通常包括支持操作的动作和相关数据。例如,在一个包含用户信息的web应用中,Controller可能返回一个包含登录用户的详细信息的JSON对象,这将允许客户端以JSON对象的形式将此数据呈现给用户,并使用它来控制其他应用程序组件的行为。此外,Controller还可以返回其他一些数据类型,如纯文本字符串或HTML。 总的来说,Controller返回JSON数据,使得客户端可以通过JavaScript与后端数据交互,获取需要的数据并进行操作。这带来了许多优势,其中包括更高效的数据传输,更低的带宽使用和更快的页面数据渲染时间。此外,JSON数据格式非常易于处理,因此可以轻松地将数据前端框架进行集成。综上所述,Controller返回JSON数据已成为现代Web应用程序中最普遍的数据交换方式之一,它大大提高了应用程序的交互效率和数据安全性。 ### 回答3: Controller返回JSON数据时,通常用于前后端分离式架构中。前端发起请求后,Controller接受请求,从数据库、缓存或其他第三方服务中获取数据,并将所需要的数据封装成JSON格式的数据返回前端。 使用JSON格式的数据可以实现小数据包传递,传输速度快,而且便于解析。同时JSON还可以实现跨语言传输,方便前后端不同编程语言之间的数据交换。Controller返回JSON数据时,需要保证返回的格式正确,能够被前端数据解析器正确解析。 在Controller内部,可以通过使用SpringMVC的ResponseBody注解,来告诉SpringMVC框架返回JSON格式数据。同时也可以通过使用Jackson等JSON解析器来进行数据的转换和序列化。 在前端接收到JSON数据之后,可以使用JavaScript的JSON.parse()方法将JSON格式数据转化成JavaScript对象。这样就可以在前端使用JavaScript来进行数据的渲染和操作。 总之,Controller返回JSON数据是一种实现前后端分离式架构的重要手段,提高了应用的性能、可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jayues_lies

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

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

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

打赏作者

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

抵扣说明:

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

余额充值