【问题标题】:AJAX response is not retaining the order of LinkedHashMap returned from the serverAJAX 响应未保留从服务器返回的 LinkedHashMap 的顺序
【发布时间】:2014-11-25 05:55:29
【问题描述】:

我使用 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;
}

请帮助我做错了什么。

【问题讨论】:

  • 你的LinkedHashMap在哪里使用..??,还有allowedWhses使用Long as a key ie IDString as a value ie Name
  • 我添加了返回链接hashmap的函数

标签: java javascript ajax response linkedhashmap


【解决方案1】:

我也遇到过同样的问题,但在 FF 中并没有发生。
问题是返回的地图被解释为数组。
地图的键是一个长整型(如果您使用字符串但具有整数值,则相同,例如“5”),因此结果是一个数组。
我的解决方案是在密钥前面添加一个“_”,以便获得假密钥。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • Java 库不对键进行排序(参见 Jackson JSON 处理器)。是浏览器(从服务器解析字符串时)没有按照您的预期构建 JSON。
    • 确实,Jackson 不会对密钥重新排序(并且确实会按 JSON 中的顺序返回它们),但 OP 没有指定他们正在使用 Jackson,所以我决定将其排除在外的答案。可能正在使用 JSON Java 库,它确实以这种方式对键进行排序。在开发工具中查看它们时,Chrome 和 Firefox 都不会重新排序键 except,因此可以将 Jackson 与有序映射一起使用并以相同的顺序处理键,尽管它不是保证,所以这不是一个好主意,除非你能确定你的所有用户都有哪些浏览器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多