Android如何对JSONObject的JSONArray排序

我已经做了一个jsonarray的JSONObject。现在我需要根据JSONObject中的值对JSONArray进行排序。以前我对自定义对象的ArrayList进行了如下排序:

比较国:

公共类KreeftenComparatorLA实现了Comparator<克雷夫特>{
公共整数比较(左撇,右撇){
返回left.latijnsenam.compareTo(right.latijnsenam);
}
}
公共类KreeftenComparatorNL实现Comparator<克雷夫特>{
公共整数比较(左撇,右撇){
返回左.naam.compareTo(右.naam);
}
}

然后对arraylist进行排序:

Collections.sort(db.lijst,new KreeftenComparatorLA());

或:

Collections.sort(db.lijst,new KreeftenComparatorNL());

但是当我对JSONArray进行类似的尝试时(JA=myJSONArray)

Collections.sort(JA,新的KreeftenComparatorNL());

Collections.sort出现错误:

类型集合中的方法sort(List,Comparator)不适用于参数(JSONArray,thisactity.KreeftenComparatorNL)

有人知道如何对JSONArray排序吗?

问题在于JSONArray或多或少地持有最终为字符串的JSONObject(和其他JSONArray)。将字符串完全反序列化到POJO中,对它们进行排序,然后再返回到JSON中,这相当繁重

第二个问题是JSONArray可以包含:Boolean、JSONArray、JSONObject、Number、String或JSONObject.NULL对象;i、 它是混合类型,这使得很难将元素转储到某个类型的列表中并对其进行排序,然后通过该列表将已排序的项转储回JSON数组。从JSONArray获取每个元素的公共类型的唯一方法是使用Object get()方法。。当然,您只有对象对象,如果不重新讨论序列化问题,就无法对它们进行任何有意义的排序

假设您的JSONArray包含同质结构的值,您可以迭代JSONArray,对每个JSONArray调用一个类型化get()方法,将它们转储到列表类型中,然后对其进行排序。如果您的JSONArray只保存“简单”类型,如字符串或数字,那么这就相对容易了。这不是确切的代码,但类似于:

列表<字符串>jsonValues=newarraylist<字符串>();
对于(int i=0;i<myJsonArray.length();i++)
add(myJsonArray.getString(i));
Collections.sort(jsonValues);
JSONArray sortedJsonArray=新JSONArray(jsonValues);

当然,如果您有嵌套对象,这可能会变得有点棘手。如果您想要排序的值在顶级活动,它可能不会太坏

列表<JSONObject>jsonValues=newarraylist<JSONObject>();
对于(int i=0;i<myJsonArray.length();i++)
add(myJsonArray.getJSONObject(i));

然后使用类似这样的比较器进行排序:

类JSONComparator实现Comparator<JSONObject>
{
公共int比较(JSONObject a、JSONObject b)
{
//valA和valB可以是任何简单类型,如数字、字符串等
字符串valA=a.get(“keyOfValueToSortBy”);
字符串valB=b.get(“keyOfValueToSortBy”);
返回valA.compareTo(valB);
//如果您的值是数字:
//if(valA>valB)
//返回1;
//if(valA<valB)
//返回-1;
//返回0;
}
}

同样,这对JSONArray中数据的同质性做出了一些假设。如果可能的话,根据你的情况进行调整。此外,您还需要添加您的异常处理等快乐编码

编辑
修正基于评论

发表评论