2011-08-09 43 views
3

我有一個與數據庫交談的servlet,然後返回一個有序的(ORDER BY時間)對象列表。在servlet部分,我有有序的JSONObject

 
       //access DB, returns a list of User objects, ordered 
     ArrayList users = MySQLDatabaseManager.selectUsers(); 
       //construct response 
     JSONObject jsonResponse = new JSONObject(); 
     int key = 0; 
     for(User user:users){ 
      log("Retrieve User " + user.toString()); 
      JSONObject jsonObj = new JSONObject(); 
      jsonObj.put("name", user.getName()); 
      jsonObj.put("time", user.getTime()); 
      jsonResponse.put(key, jsonObj); 
      key++; 
     } 
       //write out 
     out.print(jsonResponse); 

從日誌中我可以看到數據庫以正確的順序返回用戶對象。

在前端,我有

 
success: function(jsonObj){ 
      var json = JSON.parse(jsonObj); 
      var id = 0; 
      $.each(json,function(i,item) {    
       var time = item.time;    
       var name = item.name;    
       id++; 
       $("table#usertable tr:last").after('<tr><td>' + id + '</td><td width="20%">' + time + 
         '</td><td>' + name + 
         '</td></tr>'); 
      }); 

     }, 

但順序改變。

我只在返回的列表大小超過130個用戶時才注意到這一點。

我試過使用Firebug進行調試,Firebug中的「響應選項卡」顯示列表的順序與servlet中的日誌不同。

我做錯了什麼?

編輯:實例

 
{"0":{"time":"2011-07-18 18:14:28","email":"[email protected]","origin":"origin-xxx","source":"xxx","target":"xxx","url":"xxx"}, 
"1":{"time":"2011-07-18 18:29:16","email":"[email protected]","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"}, 
"2": 

,..., 
"143":{"time":"2011-08-09 09:57:27","email":"[email protected]","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"} 

,..., 
"134":{"time":"2011-08-05 06:02:57","email":"[email protected]","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"}} 
+0

請給出一個你的JSON對象的例子。 JSON對象沒有與它們關聯的特定「順序」。爲此,您應該使用一個Array(它本身可以存儲在JSON對象中)。 – ghayes

+0

嗨ghayes,謝謝你的提示(JSON對象沒有與它們相關的特定'順序')。我期待返回的對象與構建的順序相同。我仔細研究了Firebug的JSON對象,並注意到我可以使用鍵值來重新排列列表。 – user200340

+0

如果你關心排序問題,我還在我的答案中寫了一些JavaScript來做到這一點。請享用! – ghayes

回答

13

以JSON對象自身並沒有一個訂單,你應該用你的JSON對象中的陣列,以確保秩序。作爲一個例子(根據您的代碼):

jsonObj = 
      { items: 
      [ { name: "Stack", time: "..." }, 
       { name: "Overflow", time: "..." }, 
       { name: "Rocks", time: "..." }, 
       ... ] }; 

此結構將確保您的對象以正確的順序插入。

基於上面的JSON,可以將對象放入數組中,然後對數組進行排序。

var myArray = []; 
var resultArray; 

for (var j in jsonObj) { 
    myArray.push(j); 
} 

myArray = $.sort(myArray, function(a, b) { return parseInt(a) > parseInt(b); }); 

for (var i = 0; i < myArray.length; i++) { 
    resultArray.push(jsonObj[myArray[i]]); 
} 

//resultArray is now the elements in your jsonObj, properly sorted; 

但也許這是更復雜的比你正在尋找..

0

正如ghayes提到,JSON對象是無序的。 這個問題有多種解決方案。

  1. 您可以使用數組和排序來獲得有序列表。
  2. 您可以使用gson庫來獲取所需的元素順序。

    我更喜歡第二個選項,因爲它很容易使用。
-1

由於JSONObject的順序較少並且內部使用Hashmap。一種使用它從org.json下載所有類並直接在項目中使用的方法,即在JSONObject.java文件中將內部HashMap實現更改爲LinkedHashMap。下面是排序的json文件 https://github.com/abinash1/Sorted-Json-Object