Сортировать JsonArray по ключу переменной с помощью GSON - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь отсортировать JsonArray в Java с помощью GSON, я хотел бы отсортировать все внутри этого массива через переменный ключ, то есть где-то есть строка, содержащая что-то, что является ключом, по которому объект должен быть отсортирован.

Ключевая переменная: varkey1

[{"varkey1":1,"othervarkey":1},{"varkey1":6,"othervarkey":2},{"varkey1":3,"othervarkey":3},{"varkey1":12,"othervarkey":4},{"varkey1":998,"othervarkey":5}]

Таким образом, она должна выглядеть так:

[{"varkey1":1,"othervarkey":1},{"varkey1":3,"othervarkey":2},{"varkey1":6,"othervarkey":3},{"varkey1":12,"othervarkey":4},{"varkey1":998,"othervarkey":5}]

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

В следующем примере используется библиотека Google Gson - единственная сложная часть - указание библиотеке анализировать массив.

Кроме того, определение типа (класс Item) для ваших сериализованных данных json делаетс ним проще взаимодействовать через код.

package stackOv;

import java.lang.reflect.Type;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class JsonSort {
  public static void main(String[] args) throws Exception {
    Gson gson = new Gson();
    String json= "[{\"varkey1\":1,\"othervarkey\":1},{\"varkey1\":6,\"othervarkey\":2},{\"varkey1\":3,\"othervarkey\":3},{\"varkey1\":12,\"othervarkey\":4},{\"varkey1\":998,\"othervarkey\":5}]";
    Type listType = new TypeToken<List<Item>>(){}.getType();
    List<Item> list = gson.fromJson(json, listType);
    System.out.println( "list="+list);
    Collections.sort(list, Comparator.comparing(Item::getVarkey1));
    System.out.println( "list="+list);
  }
}

class Item {
  int varkey1;
  int othervarkey;
  public int getVarkey1() {
    return varkey1;
  }
  public void setVarkey1(int varkey) {
    this.varkey1 = varkey;
  }
  public int getOthervarkey() {
    return othervarkey;
  }
  public void setOthervarkey(int othervarkey) {
    this.othervarkey = othervarkey;
  }
  @Override
  public String toString() {
    return "Item[" + varkey1 + "," + othervarkey + "]";
  }
}
0 голосов
/ 03 июня 2018

Ну, вы можете просто реализовать алгоритм сортировки, который может быть специализирован для Gson JsonElement s.Если нет, вы можете просто повторно использовать стандартный Collections.sort(...), который может просто сделать эту работу за вас.По какой-то причине JsonArray реализует Iterable, а не List, где последние можно отсортировать с помощью Collection.sort.Итак, требуется пользовательский JsonArray -to- List:

final class JsonArrayList
        extends AbstractList<JsonElement> {

    private final JsonArray jsonArray;

    private JsonArrayList(final JsonArray jsonArray) {
        this.jsonArray = jsonArray;
    }

    static List<JsonElement> of(final JsonArray jsonArray) {
        return new JsonArrayList(jsonArray);
    }

    // This method is required when implementing AbstractList
    @Override
    public JsonElement get(final int index) {
        return jsonArray.get(index);
    }

    // This method is required when implementing AbstractList as well
    @Override
    public int size() {
        return jsonArray.size();
    }

    // And this one is required to make the list implementation modifiable
    @Override
    public JsonElement set(final int index, final JsonElement element) {
        return jsonArray.set(index, element);
    }

}

Теперь все остальное просто:

// No even need of Gson instantiation
final JsonArray jsonArray = new JsonParser()
        .parse(jsonReader)
        .getAsJsonArray();
// Create a JsonArray to a List view instance
final List<JsonElement> jsonElements = JsonArrays.asList(jsonArray);
// Sorting the jsonElements object
Collections.sort(jsonElements, (e1, e2) -> {
    final int i1 = e1.getAsJsonObject().get("varkey1").getAsInt();
    final int i2 = e2.getAsJsonObject().get("varkey1").getAsInt();
    return Integer.compare(i1, i2);
});

Поскольку jsonElements - это просто представлениедля jsonArray, jsonArray фактически отсортировано.

0 голосов
/ 02 июня 2018

Попробуйте следующее: -

String jsonListString = "[{\"varkey1\":1,\"othervarkey\":1},{\"varkey1\":6,\"othervarkey\":2},{\"varkey1\":3,\"othervarkey\":3},{\"varkey1\":12,\"othervarkey\":4},{\"varkey1\":998,\"othervarkey\":5}]";
JSONArray jsonArray = new JSONArray(jsonListString);

// Create Java ArrayList from JSON Array
ArrayList<JSONObject> array = new ArrayList<JSONObject>();
for (int i = 0; i < jsonArray.length(); i++) {
   try {
       array.add(jsonArray.getJSONObject(i));
   } catch (JSONException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}   

// Sort the Java Array List
Collections.sort(array, new Comparator<JSONObject>() {

    @Override
    public int compare(JSONObject lhs, JSONObject rhs) {
         // TODO Auto-generated method stub

        try {
            return (lhs.getInt("varkey1").compareTo(rhs.getInt("varkey1")));
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return 0;
        }
    }
});


// convert Java Array List to JSON Array and then to String representation.
jsonArray = new JSONArray(array);
jsonListString = jsonArray.toString();

Этот код: -

  1. Создает JSONArray из строки.

  2. Создает Java ArrayList из JSONArray.

  3. Сортировка Java ArrayList с использованием Collections.sort ()

  4. Затем создайте JSONArray из Java ArrayList.

  5. Затем верните JSONArray как строковое представление JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...