【问题标题】:Android: Sort JSONArray by object attributeAndroid:按对象属性对 JSONArray 进行排序
【发布时间】:2011-11-08 12:50:13
【问题描述】:

我正在尝试为议程创建一个“事件”列表。 为此,我收到一个 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 月。 像这样:

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

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

我的问题是,如何确保我最初的 JSONArray 中的对象按月 + 年排序,而不是按月排序。考虑到月份的对象名称是动态的(基于月份+年份)这一事实,删除names() 方法不是一种选择。我也不想更改为不同的解析系统(GSON、Jackson),因为这是唯一成功解析我的回复的系统(请参阅之前提出的问题)。


最终设法通过遍历包含全名的数组来修复它,然后检查该名称是否包含有序列表中的任何部分(包含年份 + id 的部分)。如果字符串包含该部分,则将其添加到其包含的 year+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]);   
                    }

【问题讨论】:

    标签: android json parsing arrays


    【解决方案1】:

    我推测 JSON 对象是由 map 支持的,而名称只是 Map.keys() - 键的顺序是未定义的。至少 API 规范没有说明任何单个字段的排序/排序 - 所以你必须自己对这些条目进行排序 - 基于 split(" ") 定义比较器并不难

    【讨论】:

    • 这听起来像是一个逻辑想法,但我不太确定该怎么做。我设法将月份 + 年 + id 拆分为月份和年份 + id,然后对其进行排序。这似乎可行,但是我如何将这两个部分再次连接在一起?我的想法是使用 2 个String 数组,并将列表中的项目 years+id 与另一个数组中的完整字符串进行比较,但显然您无法检查数组中的字符串是否包含一段字符串。
    • 对键进行排序后,您可以按名称检索议程条目。
    • 当您只知道部分名称时不确定这是否有效,但我最终设法修复了它,并在我的初始帖子中发布了答案
    • 正确的方法是实现比较器( java.util.Comparator ),将元素移动到 List 中然后对其进行排序 - 然后你就失去了排序的名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2013-02-12
    • 2023-04-03
    • 2011-03-21
    • 2017-08-12
    • 2021-07-20
    • 2021-07-02
    相关资源
    最近更新 更多