我正在尝试为议程创建“事件”列表。 为此,我收到一个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();
获取月份对象的名称,订单会根据实际月份而不是年份更改为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]);
}
答案 0 :(得分:0)
我推测JSON Object支持map,名称只支持Map.keys() - 键的顺序是未定义的。在leas API规范中没有说明单个字段的任何排序/排序 - 所以你必须自己订购这些条目 - 定义基于split(“”)的比较器并不困难