有序 JSONObject

IT技术 javascript jquery json servlets
2021-03-21 04:57:40

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

                //访问数据库,返回用户对象列表,有序
        ArrayList users = MySQLDatabaseManager.selectUsers();
                //构造响应
        JSONObject jsonResponse = new JSONObject();
        整数键 = 0;
        for(用户用户:用户){
            log("检索用户" + user.toString());
            JSONObject jsonObj = new JSONObject();
            jsonObj.put("name", user.getName());
            jsonObj.put("time", user.getTime());
            jsonResponse.put(key, jsonObj);
            键++;
        }
                //写出
        out.print(jsonResponse);

从日志中我可以看到数据库以正确的顺序返回用户对象。

在前端,我有

成功:函数(jsonObj){
            var json = JSON.parse(jsonObj);
            变量 ID = 0;
            $.each(json,function(i,item) {              
                var time = item.time;               
                var name = item.name;               
                身份证++;
                $("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","目标":"xxx","url":"xxx"},
"1":{"time":"2011-07-18 18:29:16","email":"xxx@gmail.com","origin":"xxx","source":"xxx", "目标":"xxx","url":"xxx"},
“2”:

,...,
"143":{"time":"2011-08-09 09:57:27","email":"xxx@gmail.com","origin":"xxx","source":"xxx", "目标":"xxx","url":"xxx"}

,...,
"134":{"time":"2011-08-05 06:02:57","email":"xxx@gmail.com","origin":"xxx","source":"xxx", "目标":"xxx","url":"xxx"}}
3个回答

由于 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;

但也许这比你正在寻找的更复杂..

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

  1. 您可以使用数组并对其进行排序以获取有序列表。
  2. 您可以使用gson库来获取所需的元素顺序。

    我更喜欢第二种选择,因为它易于使用。

由于 JSONObject 的顺序较少,并且在内部使用 Hashmap。一种使用它从 org.json 下载所有类并直接在您的项目中使用的方法,方法是将内部 HashMap 实现更改为 JSONObject.java 文件中的 LinkedHashMap。下面是排序的 json 文件 https://github.com/abinash1/Sorted-Json-Object