我有一个 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);
从日志中我可以看到数据库以正确的顺序返回了用户对象。
在前端,我有
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":"xxx@gmail.com","origin":"origin-xxx","source":"xxx","target":"xxx","url":"xxx"}, "1":{"time":"2011-07-18 18:29:16","email":"xxx@gmail.com","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"}, "2": ,..., "143":{"time":"2011-08-09 09:57:27","email":"xxx@gmail.com","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"} ,..., "134":{"time":"2011-08-05 06:02:57","email":"xxx@gmail.com","origin":"xxx","source":"xxx","target":"xxx","url":"xxx"}}
最佳答案
由于 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;
但也许这比您正在寻找的更复杂..
关于javascript - 有序的 JSONObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6993645/