我有一个与数据库对话的servlet,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有
//访问数据库,返回用户对象列表,顺序 ArrayList用户= MySQLDatabaseManager.selectUsers(); //构造响应 JSONObject jsonResponse =新的JSONObject(); int键= 0; 对于(用户用户:用户){ log(“检索用户” + user.toString()); JSONObject jsonObj =新的JSONObject(); jsonObj.put(“ name”,user.getName()); jsonObj.put(“ time”,user.getTime()); jsonResponse.put(key,jsonObj); 键++; } //写出 out.print(jsonResponse);
从日志中,我可以看到数据库以正确的顺序返回了User对象。
在前端,我有
成功:函数(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%”>'+时间+ '</ td> <td>'+名称+ '</ 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”:{“时间”:“ 2011-08-09 09:57:27”,“电子邮件”:“ xxx@gmail.com”,“来源”:“ xxx”,“来源”:“ 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;
但这也许比您想要的要复杂。