Das Problem ist, dass JSONArray mehr oder weniger JSONObjects (und andere JSONArrays) enthält, die letztlich Zeichenfolgen sind. Das Deserialisieren der Strings vollständig in POJOs, das Sortieren dieser Strings und dann zurück in JSON ist ziemlich schwer.
Das zweite Problem ist, dass ein JSONArray enthalten kann: Boolean, JSONArray, JSONObject, Number, String oder das JSONObject.NULL-Objekt; d. h. es sind gemischte Typen, was es schwierig macht, die Elemente einfach in eine Liste eines Typs abzulegen und diese zu sortieren, dann durch die Liste zu gehen, um sortierte Objekte zurück in das JSON-Array zu werfen. Der einzige sichere Weg, um einen gemeinsamen Typ jedes Elements aus dem JSONArray zu erhalten, ist die Verwendung der Object get() -Methode. Natürlich haben Sie nur Objektobjekte und können keine sinnvolle Sortierung an ihnen vornehmen, ohne das Objekt erneut zu durchsuchen Serialisierungsproblem.
Angenommen, Ihr JSONArray enthält homogen strukturierte Werte. Sie könnten das JSONArray durchlaufen, indem Sie eine der typisierten get() -Methoden aufrufen, sie in einen List-Typ ablegen und danach sortieren. Wenn Ihr JSONArray nur einen "einfachen" Typ wie String oder Zahlen enthält, ist das relativ einfach. Dies ist nicht richtig Code, sondern so etwas wie:
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);
Natürlich, wenn Sie Objekte verschachtelt haben diese ein wenig schwieriger zu bekommen. Wenn der Wert (e) Sie leben in der obersten Ebene sortieren möchten, kann es nicht soo schlecht ...
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < myJsonArray.length(); i++)
jsonValues.add(myJsonArray.getJSONObject(i));
Dann einen Komparator wie folgt verwenden zu sortieren:
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;
}
}
Wieder , das macht einige Annahmen über die Homogenität der Daten in Ihrem JSONArray. Passen Sie, wenn möglich, an Ihren Fall an. Außerdem müssen Sie Ihre Ausnahmebehandlung hinzufügen, usw. Happy Coding!
bearbeiten feste basierend auf Kommentare
möglich Betrogene von http://stackoverflow.com/questions/4833084/is-there-any-easy-way-to-sort- a-jsonarray-von-objekten-by-ein-attribut-in-android? rq = 1 – petey
Betrachten Sie dies: Wenn Sie sortieren können, bevor Sie das JsonArray erstellen, tun Sie das. Sie können es später auch im JavaScript sortieren. Ich denke, eine Liste aus dem JsonArray aufzubauen, die Liste zu sortieren, dann das JsonArray neu aufzubauen ist ziemlich schrecklich :) –