AJAX响应不保留从服务器返回的LinkedHashMap的顺序

时间:2014-11-25 05:55:30

标签: java javascript ajax response linkedhashmap

我使用LinkedHashMap来存储按某些业务规则排序的映射条目,我将它发送到客户端,但我的AJAX响应总是按地图键排序。

我的排序功能:

protected Map<Long, String> sortWarehousesMap(Map<Long, String> warehousesMapTemp) {
    List<Map.Entry<Long, String>> entries = new ArrayList<Map.Entry<Long, String>>(warehousesMapTemp.entrySet());

    Collections.sort(entries, new Comparator<Map.Entry<Long, String>>() {

        public int compare(Map.Entry<Long, String> a, Map.Entry<Long, String> b) {
            return a.getValue().compareTo(b.getValue());
        }
    });
    Map<Long, String> sortedWarehousesMapTemp = new LinkedHashMap<Long, String>();
    for (Map.Entry<Long, String> entry : entries) {
        sortedWarehousesMapTemp.put(entry.getKey(), entry.getValue());
    }
    return sortedWarehousesMapTemp;
}

请帮助我,我做错了什么。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并且在FF中没有发生。
问题是返回的映射被解释为数组。
映射的键是Long(如果使用String但是使用整数值,例如“5”),因此结果是一个数组。
我的解决方案是在密钥前添加一个“_”以便有一个假密钥。

答案 1 :(得分:1)

你提到了一个AJAX响应,所以我假设在某些时候这被转换为JSON表示。当您使用Map时,这将转换为JSON对象,遗憾的是JSON规范不保证对象中属性的顺序(参见Does JavaScript Guarantee Object Property Order?),它实际上是未指定的。无论您使用哪种库在Java对象和JSON表示之间进行转换,都可能为您排序密钥。

如果绝对必须保留JSON中某些内容的顺序,则必须使用JSON数组。