2014-11-25 90 views
1

返回我使用LinkedHashMap中存儲一些業務規則有序映射條目,我把它發送給客戶端,但我的Ajax響應總是得到由地圖鍵排序。AJAX響應不保留LinkedHashMap的順序從服務器

我的排序功能:

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; 
} 

請幫我我在做什麼錯。

+0

你使用的'LinkedHashMap'在哪裏???,也是'allowedWhses'使用'Long作爲一個鍵即ID'和'String作爲一個值,即Name' – 2014-11-25 05:59:15

+0

我添加了鏈接hashmap返回的函數 – user2375298 2014-11-25 06:03:26

回答

1

你提到的Ajax響應,所以我假設在某個時刻,這是被翻譯成JSON表示。在使用Map時,這將轉換爲JSON對象,不幸的是,JSON規範不能保證對象中屬性的順序(請參閱Does JavaScript Guarantee Object Property Order?),但它的字面意思不明確。無論您使用哪種庫在Java對象和JSON表示之間進行轉換,都可能爲您排序鍵。

如果你絕對必須保存在JSON的東西的順序,你將不得不使用JSON數組。

+0

Java庫不會對鍵進行排序(請參閱Jackson JSON處理器)。這是瀏覽器(同時解析來自服務器的字符串),並不像您期望的那樣構建JSON。 – 2014-11-25 13:53:39

+0

的確,傑克遜不會重新排序鍵(並且確實會按照JSON的順序返回它們),但是OP沒有指定他們使用的是傑克遜,所以我決定將結果排除在答案之外。可能有一個JSON Java庫正在使用,它可以按照這種方式對鍵進行排序。 Chrome和Firefox都不會重新排序按鍵**,除非在開發工具中查看按鍵**,所以可以使用Jackson的有序地圖並以相同的順序處理按鍵,儘管它不能保證,所以它是除非您可以確定您的所有用戶擁有哪個瀏覽器,否則不是一個好主意。 – 2014-11-25 14:48:40

1

我有同樣的問題,並沒有在FF發生。
問題是返回的地圖被解釋爲數組。
你的地圖的關鍵是一個Long(如果你使用String,但是使用整數值,例如「5」),所以結果是一個Array。
我的解決方案是在密鑰前添加一個「_」,以便擁有一個假密鑰。