问题是 JSONArray 或多或少保存了最终是字符串的 JSONObjects(和其他 JSONArrays)。将字符串完全反序列化为 POJO,对它们进行排序,然后返回 JSON 是相当繁重的。
第二个问题是 JSONArray 可以包含:Boolean、JSONArray、JSONObject、Number、String 或 JSONObject.NULL 对象;也就是说,它是混合类型,因此很难将元素转储到某种类型的列表中并对其进行排序,然后通过列表将排序后的项目转储回 JSON 数组。从 JSONArray 获取每个元素的通用类型的唯一确定方法是使用 Object get() 方法。当然,那么您拥有的只是 Object 对象,并且在不重新访问的情况下无法对它们进行任何有意义的排序序列化问题。
假设您的 JSONArray 包含同类结构的值,您可以迭代 JSONArray,对每个值调用一种类型化的 get() 方法,将它们转储到 List 类型中,然后对其进行排序。如果您的 JSONArray 仅保存“简单”类型(例如字符串或数字),则这相对容易。这不是确切的代码,而是类似:
List<String> jsonValues = new ArrayList<String>();
for (int i = 0; i < myJsonArray.length(); i++)
jsonValues.add(myJsonArray.getString(i));
Collections.sort(jsonValues);
JSONArray sortedJsonArray = new JSONArray(jsonValues);
当然,如果您有嵌套对象,这可能会变得有点棘手。如果您想要在顶层实时排序的值,它可能还不错......
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < myJsonArray.length(); i++)
jsonValues.add(myJsonArray.getJSONObject(i));
然后使用这样的比较器进行排序:
class JSONComparator implements Comparator<JSONObject>
{
public int compare(JSONObject a, JSONObject b)
{
//valA and valB could be any simple type, such as number, string, whatever
String valA = a.get("keyOfValueToSortBy");
String valB = b.get("keyOfValueToSortBy");
return valA.compareTo(valB);
//if your value is numeric:
//if(valA > valB)
// return 1;
//if(valA < valB)
// return -1;
//return 0;
}
}
同样,这对 JSONArray 中数据的同质性做出了一些假设。如果可能的话,根据您的情况进行调整。此外,您还需要添加异常处理等。祝您编码愉快!
edit根据评论修复