Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android how to sort JSONArray of JSONObjects

Tags:

I have made a jsonarray of jsonobjects. Now I need to sort the JSONArray on base of a value from the jsonobjects. Formerly I sorted ArrayLists of custom objects like this:

Comparators:

public class KreeftenComparatorLA implements Comparator<Kreeft> {     public int compare(Kreeft left, Kreeft right) {         return left.latijnseNaam.compareTo(right.latijnseNaam);     } } public class KreeftenComparatorNL implements Comparator<Kreeft> {     public int compare(Kreeft left, Kreeft right) {         return left.naam.compareTo(right.naam);     } } 

And then sort the arraylist:

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

or:

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

But when I try the same thing with the JSONArray like this (JA = my jsonarray)

Collections.sort(JA, new KreeftenComparatorNL()); 

the Collections.sort gives an error:

The method sort(List, Comparator) in the type Collections is not applicable for the arguments (JSONArray, ThisActicity.KreeftenComparatorNL)

Does anybody know how to sort the JSONArray?

like image 821
Simon Avatar asked Oct 15 '12 18:10

Simon


People also ask

How do you iterate a JSONArray?

1) Create a Maven project and add json dependency in POM. xml file. 2) Create a string of JSON data which we convert into JSON object to manipulate its data. 3) After that, we get the JSON Array from the JSON Object using getJSONArray() method and store it into a variable of type JSONArray.

Can we convert JSONArray to JSONObject?

Core Java bootcamp program with Hands on practiceWe can also add a JSONArray to JSONObject. We need to add a few items to an ArrayList first and pass this list to the put() method of JSONArray class and finally add this array to JSONObject using the put() method.

How do I check if a JSONArray is empty?

isEmpty. Checks if the JsonArray is empty or not. Returns: true if it is, false otherwise.

How do I sort in Android Studio?

Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml. In the above code, we have taken text view to sorted array.


2 Answers

The issue is that JSONArray more or less holds JSONObjects (and other JSONArrays) which ultimately are strings. Deserializing the strings entirely into POJOs, sorting those, then back into JSON is fairly heavy.

The second issue is that a JSONArray can contain: Boolean, JSONArray, JSONObject, Number, String, or the JSONObject.NULL object; i.e. it is mixed types, making it hard to just dump the elements into a List of some type and sort that, then pass through the list dumping sorted items back into the JSON array. the only certain way to get a common type of each element from the JSONArray is using the Object get() method.. of course then all you have is Object objects and won't be able to do any meaningful sorting on them without revisiting the serialization issue.

Assuming your JSONArray contains homogeneously structured values, you could iterate through the JSONArray, calling one of the typed get() methods on each one, dumping them into a List type, then sorting on that. If your JSONArray just holds "simple" type like String or numbers, this is relatively easy. This isn't exact code but something like:

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); 

Of course, if you have nested objects this can get a little trickier. If the value(s) you want to sort on live in the top level, it may not be soo bad...

List<JSONObject> jsonValues = new ArrayList<JSONObject>(); for (int i = 0; i < myJsonArray.length(); i++)    jsonValues.add(myJsonArray.getJSONObject(i)); 

Then use a comparator like this to sort:

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;         } } 

Again, this makes some assumptions about the homogeneity of the data in your JSONArray. Adjust to your case if possible. Also you will need to add your exception handling, etc. Happy coding!

edit fixed based on comments

like image 195
speakingcode Avatar answered Oct 11 '22 17:10

speakingcode


In order to fill up an Android list ArrayAdapter I needed to do just this. This is how I did it:

Activity code building a list from a JSONArray:

JSONArray kids = node.getJSONArray("contents"); kids = JSONUtil.sort(kids, new Comparator(){    public int compare(Object a, Object b){       JSONObject    ja = (JSONObject)a;       JSONObject    jb = (JSONObject)b;       return ja.optString("name", "").toLowerCase().compareTo(jb.optString("name", "").toLowerCase();    } }); // in my case I wanted the original larger object contents sorted... node.put("contents", kids); 

And in JSONUtil (my helper):

public static JSONArray sort(JSONArray array, Comparator c){     List    asList = new ArrayList(array.length());     for (int i=0; i<array.length(); i++){       asList.add(array.opt(i));     }     Collections.sort(asList, c);     JSONArray  res = new JSONArray();     for (Object o : asList){       res.put(o);     }     return res; } 
like image 30
Tim Beres Avatar answered Oct 11 '22 17:10

Tim Beres