Problem polega na tym, że JSONArray zawiera mniej lub więcej JSONObjectów (i innych JSONArrays), które ostatecznie są ciągami. Deserializacja łańcuchów w całości do POJO, ich sortowanie, a następnie powrót do JSON jest dość ciężki.
Drugim problemem jest to, że JSONArray może zawierać: Boolean, JSONArray, JSONObject, Number, String lub JSONObject.NULL; tj. jest to typ mieszany, co sprawia, że trudno jest po prostu zrzucić elementy do listy pewnego rodzaju i posortować, a następnie przejść przez listę, przesyłając posortowane elementy z powrotem do tablicy JSON. jedynym sposobem na uzyskanie wspólnego typu każdego elementu z JSONArray jest użycie metody Object get(). Oczywiście wszystko, co masz, to obiekty Object i nie będzie w stanie przeprowadzić żadnego znaczącego sortowania bez ponownego przeglądania problem serializacji.
Zakładając, że JSONArray zawiera jednorodnie ustrukturyzowane wartości, możesz wykonać iterację za pomocą JSONArray, wywołując jedną z wpisanych metod get() na każdej z nich, umieszczając je na liście, a następnie sortując. Jeśli twój JSONArray ma po prostu "prosty" typ, jak ciąg lub liczby, jest to stosunkowo łatwe. To nie jest dokładny kod, ale coś takiego:
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);
oczywiście, jeśli masz zagnieżdżone obiekty mogą to trochę trudniejsze. Jeśli wartość (y) chcesz posortować na żywo na najwyższym poziomie, to nie może być soo bad ...
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < myJsonArray.length(); i++)
jsonValues.add(myJsonArray.getJSONObject(i));
Następnie użyj komparator tak uporządkować:
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;
}
}
Ponownie , to czyni pewne założenia dotyczące jednorodności danych w twoim JSONArray. Dostosuj do swojego przypadku, jeśli to możliwe. Również musisz dodać obsługę wyjątków, itp. Szczęśliwe kodowanie!
edit ustalone na podstawie ich uwag
możliwe dupe od http://stackoverflow.com/questions/4833084/is-there-any-easy-way-to-sort- a-jsonarray-of-objects-by-an-atrybut-in-android? rq = 1 – petey
Rozważ to: Jeśli możesz posortować przed zbudowaniem JsonArray, zrób to. Możesz również posortować go w JavaScript później. Myślę, że budowanie listy z JsonArray, sortowanie listy, a następnie przebudowanie JsonArray jest dość straszne :) –