controller返回已经排序的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分

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答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数据是一种实现前后端分离式架构的重要手段,提高了应用的性能、可维护性和可扩展性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值