Venkatesh Goud
Venkatesh Goud

Reputation: 636

How to sort JSON object in java?

I've been looking for a while and want a way to sort a JSON object like this:

{"results": [
  {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "35",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "SADD MAARAB PHARMACY"
      },
    "geometryType": "esriGeometryPoint",
   },
  {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "1",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "GAYATHY HOSPITAL  PHARMACY"
    },
    "geometryType": "esriGeometryPoint",
  },
     {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "255",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "AL DEWAN PHARMACY"
      },
    "geometryType": "esriGeometryPoint",
   }
]}

and sort is alphabetically by value of "COMMERCIALNAME_E" to get:

{"results": [
   {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "255",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "AL DEWAN PHARMACY"
      },
    "geometryType": "esriGeometryPoint"
   },
  {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "1",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "GAYATHY HOSPITAL  PHARMACY"
       },
    "geometryType": "esriGeometryPoint"
   },
   {
    "layerId": 5,
    "layerName": "Pharmaceutical Entities",
    "attributes": {
      "OBJECTID": "35",
      "FACILITYTYPE": "Pharmacy",
      "FACILITYSUBTYPE": "24 Hr Pharmacy",
      "COMMERCIALNAME_E": "SADD MAARAB PHARMACY"
      },
    "geometryType": "esriGeometryPoint"
   }
]}

I can't find any code that will do this. Can anyone give me some help?

Upvotes: 17

Views: 89957

Answers (6)

RickHigh
RickHigh

Reputation: 1858

Boon provides JSON sorting, searching, filtering and more.

Check out:

https://web.archive.org/web/20231123101220/https://rick-hightower.blogspot.com/2014/03/boon-sorting-for-java-java-collections.html (Boon Sorting)

    Object jsonObject = fromJson(json);
    List<?> jsonDepartments = (List<?>) jsonObject;
    List<?> jsonEmployees = (List<Employee>) atIndex(jsonDepartments, "employees");

    sort(employees); //natural sort


    sort( employees, "lastName"); //sort by last name



    sort( departmentList ); //natural sort

    

    sort( employees, sortBy( "department.name" ),
                     sortByDescending( "lastName" ),
                     sortBy( "firstName" ) ); //you get the idea

    

    sort(employees,
            sortBy("contactInfo.phoneNumbers[0]")); //you can even sort by a path expression


    

    sort( employees,
            sortByDescending("contactInfo.phoneNumbers[0]") ); //backwards by a path expression


    max(employees); //gets the max (natural order employee)


    greatest(employees, 5); //gets the top five


    min(employees); //gets the lowest

 

    least(employees, 5); //gets the lowest five


    max(employees, "salary"); //gets the top salaried employee

    greatest(employees, "salary", 5); //gets the top five salaried employees


    min(employees, "salary"); //the least

    least(employees, "salary", 5); //the lowest five salaried employees

Boon is also currently the fastest JSON parser on the JVM (circa March 2014).

Upvotes: 2

Gayan Chinthaka
Gayan Chinthaka

Reputation: 569

This is the way what I sorted from gson.

Param: 1. jsonArray, 2. member Name to be sorted

sample JSON:

[{
    "name": "foo",
    "value": "sam"
},
{
    "name": "doo",
    "value": "cool"
},
{
    "name": "app",
    "value": "Zip"
},
{
    "name": "mol",
    "value": "JOUL"
},
{
    "name": "number",
    "value": "123"
}]

code :

private static JsonArray JsonObjectSort(final JsonArray jsonArray, final String sortBy) {
    final JsonArray sortedArr = new JsonArray();
    final ArrayList<JsonObject> listJsonObj = new ArrayList<>();
    for (int i = 0; i < jsonArray.size(); i++) {
        listJsonObj.add((JsonObject) jsonArray.get(i));
    }

    Collections.sort(listJsonObj,
            (o1, o2) -> o1.get(sortBy).getAsString().compareToIgnoreCase(o2.get(sortBy).getAsString()));

    for (int i = 0; i < jsonArray.size(); i++) {
        sortedArr.add(listJsonObj.get(i));
    }
    System.out.println(sortedArr);
    return sortedArr;
}

Upvotes: 0

Malkeith Singh
Malkeith Singh

Reputation: 245

I used Jackson to do it. Below is sort method implementation you can probably add more checks to it and add a return type

 public void sort(String data) throws IOException {
    JsonNode node = new ObjectMapper().readTree(data);
    ArrayNode array = (ArrayNode) node.get("results");
    Iterator<JsonNode> i =array.elements();
    List<JsonNode> list = new ArrayList<>();
    while(i.hasNext()){
        list.add(i.next());
    }
    list.sort(Comparator.comparing(o -> o.get("attributes").get("COMMERCIALNAME_E").asText()));
}

Upvotes: 5

Jigar Joshi
Jigar Joshi

Reputation: 240908

Parse these JSON to Collection of Objects and use comparator to sort it using your preferred field.

Example:

import com.google.gson.Gson;

class Person {
  private int age;
  private String name;
}

String json = "{'age':22,'name':'Jigar'}";
Gson gson = new Gson();
TestJsonFromObject obj = gson.fromJson(json, Person.class);  

If you want to create JSON from Object.

Person p = new Person();
p.setName("Jigar");
p.setAge(22);
String jsonStr = new com.google.gson.Gson().toJson(obj);

Upvotes: 6

Sarneet Kaur
Sarneet Kaur

Reputation: 2998

I used JSON simple API to sort this. Here is my code:

import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class SortJSON {

public static void main(String[] args) {
    JSONParser parser = new JSONParser();
    try {
        JSONObject o = (JSONObject) parser.parse(new FileReader("test3.json"));
        JSONArray array = (JSONArray) o.get("results");
        ArrayList<JSONObject> list = new ArrayList<>();

        for (int i = 0; i < array.size(); i++) {
            list.add((JSONObject) array.get(i));
        }
        Collections.sort(list, new MyJSONComparator());

        for (JSONObject obj : list) {
            System.out.println(((JSONObject) obj.get("attributes")).get("OBJECTID"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

class MyJSONComparator implements Comparator<JSONObject> {

@Override
public int compare(JSONObject o1, JSONObject o2) {
    String v1 = (String) ((JSONObject) o1.get("attributes")).get("COMMERCIALNAME_E");
    String v3 = (String) ((JSONObject) o2.get("attributes")).get("COMMERCIALNAME_E");
    return v1.compareTo(v3);
}

}

Upvotes: 13

Bart van Heukelom
Bart van Heukelom

Reputation: 44104

You can write a List<JSONObject> wrapper around the JSON array, then use Collections.sort with a custom Comparator<JSONObject>.

Upvotes: 2

Related Questions