Javascript 有序JSONObject

Javascript 有序JSONObject,javascript,jquery,json,servlets,Javascript,Jquery,Json,Servlets,我有一个servlet,它与数据库对话,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有 //access DB, returns a list of User objects, ordered ArrayList users = MySQLDatabaseManager.selectUsers(); //construct response JSONObject jsonResponse = new JSON

我有一个servlet,它与数据库对话,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有

//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); //access DB,返回按顺序排列的用户对象列表 ArrayList users=MySQLDatabaseManager.selectUsers(); //构造响应 JSONObject jsonResponse=新的JSONObject(); int键=0; for(用户:用户){ 日志(“检索用户”+用户.toString()); JSONObject jsonObj=新的JSONObject(); put(“name”,user.getName()); put(“time”,user.getTime()); put(key,jsonObj); key++; } //写出 打印(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>'); }); }, 成功:函数(jsonObj){ var json=json.parse(jsonObj); var-id=0; $.each(json,函数(i,项){ 变量时间=项目时间; var name=item.name; id++; $(“table#usertable tr:last”)。之后(“”+id+“”+time+ ''+姓名+ ''); }); }, 但是顺序改变了

我只在返回的列表很大(超过130个用户)时才注意到这一点

我曾尝试使用Firebug进行调试,Firebug中的“响应选项卡”显示列表的顺序与servlet中的日志不同

我做错什么了吗

编辑:示例

{“0”:{“时间”:“2011-07-18 18:14:28”,“电子邮件”:xxx@gmail.com“,”来源“:”来源“:”xxx“,”目标“:”xxx“,”url“:”xxx”}, “1:{“时间”:“2011-07-18 18:29:16”,“电子邮件”:”xxx@gmail.com“,”来源“:”xxx“,”来源“:”xxx“,”目标“:”xxx“,”url“:”xxx”}, "2": ,..., 143:{“时间”:“2011-08-09 09:57:27”,“电子邮件”:xxx@gmail.com“,”来源“:”xxx“,”来源“:”xxx“,”目标“:”xxx“,”url“:”xxx”} ,..., “134”:{“时间”:“2011-08-05 06:02:57”,“电子邮件”:”xxx@gmail.com“,”来源“:”xxx“,”来源“:”xxx“,”目标“:”xxx“,”url“:”xxx”}
由于JSON对象本身并没有顺序,所以应该在JSON对象中使用数组来确保顺序。例如(基于您的代码):

此结构将确保以正确的顺序插入对象

基于上面的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;
var myArray=[];
结果变量;
for(jsonObj中的变量j){
myArray.push(j);
}
myArray=$.sort(myArray,函数(a,b){return parseInt(a)>parseInt(b);});
对于(var i=0;i
但这可能比您要寻找的更复杂。

正如前面提到的,json对象是无序的。 这个问题有多种解决方案

  • 您可以使用数组和对其排序来获得有序列表
  • 可以使用库获取所需的元素顺序

    我更喜欢第二个选项,因为它很容易使用

  • 因为JSONObject是无顺序的,并且在内部使用Hashmap。一种使用它从org.json下载所有类并直接在项目中使用的方法是在JSONObject.java文件中将内部HashMap实现更改为LinkedHashMap。下面是已排序的json文件

    请举例说明JSON对象的外观。JSON对象没有与之关联的特定“顺序”。为此,您应该使用数组(数组本身可以存储在JSON对象中)。我希望返回的对象具有与构造时相同的顺序。我仔细查看了Firebug中的JSON对象,注意到我可以使用键值对列表进行重新排序。如果您关心排序,我也在回答中编写了一些JavaScript来实现这一点。享受吧!可能重复的
     jsonObj = 
              { items:
                [ { name: "Stack", time: "..." },
                  { name: "Overflow", time: "..." },
                  { name: "Rocks", time: "..." },
                  ... ] };
    
     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;