Android:按对象属性排序JSONArray

时间:2011-11-08 12:50:13

标签: android json parsing arrays

我正在尝试为议程创建“事件”列表。 为此,我收到一个JSON响应,其中包含几个月对象,而这些对象又包含一组事件对象。

当我收到回复时,会订购所有月份,如下所示:

    {
  "Agenda/Future": {
    "November 2011/0": [
      {
        "id": "5710",
        "eventid": "",
        "name": "test7",
        "startdate": "nov 9",
        "datecompute": "2011-11-09T12:00:00",
        "group_month": "November 2011",
        "flg_Data": "Database"
      },
      {
        "id": "5707",
        "eventid": "",
        "name": "test4",
        "startdate": "nov 17",
        "datecompute": "2011-11-17T12:00:00",
        "group_month": "November 2011",
        "flg_Data": "Database"
      },
      {
        "id": "5704",
        "eventid": "",
        "name": "test",
        "startdate": "nov 30",
        "datecompute": "2011-11-30T12:00:00",
        "group_month": "November 2011",
        "flg_Data": "Database"
      }
    ],
    "December 2011/1": [
      {
        "id": "5705",
        "eventid": "",
        "name": "test2",
        "startdate": "dec 28",
        "datecompute": "2011-12-28T12:00:00",
        "group_month": "December 2011",
        "flg_Data": "Database"
      }
    ],
    "November 2013/2": [
      {
        "id": "5706",
        "eventid": "",
        "name": "test3",
        "startdate": "nov 1",
        "datecompute": "2013-11-01T12:00:00",
        "group_month": "November 2013",
        "flg_Data": "Database"
      },
      {
        "id": "5708",
        "eventid": "",
        "name": "test5",
        "startdate": "nov 15",
        "datecompute": "2013-11-15T12:00:00",
        "group_month": "November 2013",
        "flg_Data": "Database"
      },
      {
        "id": "5709",
        "eventid": "",
        "name": "test6",
        "startdate": "nov 15",
        "datecompute": "2013-11-15T12:00:00",
        "group_month": "November 2013",
        "flg_Data": "Database"
      }
    ]
  }
}

首先是2011年11月,然后是2011年12月,最后是2013年11月。

然而,在解析此回复后,订单已更改为2011年11月,2013年11月,2011年12月。 像这样:

enter image description here

显然,这可能会引起一些混乱。

我的理论是,由于使用JSONArray eventNames = agenda.names();获取月份对象的名称,订单会根据实际月份而不是年份更改为1。这已在2022年3月添加另一个事件后得到确认,此事件最先结束。 我查看了我的代码,在任何地方都找不到任何会改变排序的函数,使names();成为最可能的罪魁祸首。

我的问题是,如何确保我的初始JSONArray中的对象按月+年订购,而不是按月订购。考虑到月份的对象名称是动态的(基于月份+年份),删除names()方法不是一种选择。我也不想改为使用不同的解析系统(GSON,Jackson),因为这是唯一一个在解析我的响应时成功的解析系统(见前面提到的问题)。


最终设法通过循环包含全名的数组来修复它,然后检查该名称是否包含有序列表中的任何部分(包含年份+ id的部分)。如果字符串包含该部分,请将其添加到包含的年份+ id位置的新数组中。代码可以在下面找到

String[] test = new String[eventNames.length()];
                    String[] test2;

                    for (int x = 0; x < eventNames.length(); x++){
                        //System.out.println(eventNames.get(x).toString());
                        String[] xx = eventNames.get(x).toString().split(" ");
                        test[x] = xx[1];


                    }

                    Arrays.sort(test);

                    String[] test3 = new String[eventNames.length()];
                    for(int q = 0; q < eventNames.length(); q++){
                        String str = eventNames.get(q).toString();
                        for(int p = 0; p < test.length; p++){
                            if(str.contains(test[p])){
                                test3[p] = str;
                            }
                        }
                    }


                    System.out.println(test.toString());
                    for (int x = 0; x < eventNames.length(); x++){
                        System.out.println("maand :"+x+" "+test3[x]);   
                    }

1 个答案:

答案 0 :(得分:0)

我推测JSON Object支持map,名称只支持Map.keys() - 键的顺序是未定义的。在leas API规范中没有说明单个字段的任何排序/排序 - 所以你必须自己订购这些条目 - 定义基于split(“”)的比较器并不困难