Как отсортировать JSONArray по ключу в JSONObject?

204
02 декабря 2019, 17:20

Получаю такого вида JSONArray:

[
    {
        "id": 1,
        "name": "Иван",
        "image": "/images/category/",
        "status": 1,
        "totalMessages": 5
    },
    {
        "id": 2,
        "name": "Сергей",
        "image": "/images/category/",
        "status": 1,
        "totalMessages": 120
    },
    {
        "id": 3,
        "name": "Вася",
        "image": "/images/category/",
        "status": 1,
        "totalMessages": 40
    }
]

Как получаю?

    String json = JsonUtils.getJSONString("http://mysite.com/simple?data");
    JSONArray data = new JSONArray(json);
    JSONObject objJson = null;
    // Попытался здесь сортировать.. но сортирует неверно. 
    data = JsonUtils.sort(data, new Comparator() {
        public int compare(Object a, Object b) {
            JSONObject ja = (JSONObject) a;
            JSONObject jb = (JSONObject) b;
            return ja.optString("totalMessages", "").toUpperCase().compareTo(jb.optString("totalMessages", "").toLowerCase());
        }
    });
      // Здесь уже всё прогоняю и заполняю ArrayList данными...
        for (int i = 0; i < data.length(); i++) {
            objJson = data.getJSONObject(i);
            String id = objJson.getString("id");
            String name = objJson.getString("name");
            String image = objJson.getString("image");
            String status = objJson.getString("status");
            String totalMessages = objJson.getString("totalMessages");
            myArrayList.add(new Item(id, name, image, status, totalMessages));
        }

Как сделать такой результат на выходе? Чтобы сортировал по ключу totalMessages , не смотря на id, name, image и status ключи? :

[
    {
        "id": 1,
        "name": "Иван",
        "image": "/images/category/",
        "status": 1,
        "totalMessages": 5
    },
    {
        "id": 3,
        "name": "Вася",
        "image": "/images/category/",
        "status": 1,
        "totalMessages": 40
    },
    {
        "id": 2,
        "name": "Сергей",
        "image": "/images/category/",
        "status": 1,
        "totalMessages": 120
    }
]

Заранее благодарен, кто поможет разобраться, что я не так делаю :)

P.S: вот содержимое JSONArray sort ()

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

Результат странный потому что Вы сортируете значения в строковом представлении. Чтобы сделать правильный порядок нужно сортировать в числовом:

data = JsonUtils.sort(data, new Comparator() {
        public int compare(Object a, Object b) {
            JSONObject ja = (JSONObject) a;
            JSONObject jb = (JSONObject) b;
            return  Integer.compare(ja.optInt("totalMessages"), jb.optInt("totalMessages")));

Только у Вас сейчас почему-то обратный порядок - если что поменяйте местами параметры в Integer.compare(a <=> b)

READ ALSO
рабочий цикл Vompal Wabbit

рабочий цикл Vompal Wabbit

Хотелось бы узнать, какие есть практики использование программы vompal wabbit (можно и похожие, здесь это не важно)

139
Изменение внешнего вида фрагмента

Изменение внешнего вида фрагмента

Можно ли изменить внешний вид фрагмента (установить другой View) во время его работы или это возможно только в методе onCreateView()?

144
android studio создаёт поломанный проект

android studio создаёт поломанный проект

Создаю проект и выскакивает такая ошибка:

208