【问题标题】:How to sort GSON Array based on a key?如何根据键对 GSON 数组进行排序?
【发布时间】:2013-09-02 14:42:14
【问题描述】:

考虑以下是我的数组

[
  {"id":10,"name":"name10","valid":true},
  {"id":12,"name":"name12","valid":false},
  {"id":11,"name":"name11","valid":false},
  {"id":9,"name":"name9","valid":true}
]

用它创建了一个JsonArray,就像下面的代码一样:

//Create a JSON Parser using GSON library 
objJsonParser = new JsonParser();
String strArrayText = [{"id":9,"name":"name9","valid":true}, ...]
JsonArray jsonArrayOfJsonObjects = objJsonParser.parse(strArrayText).getAsJsonArray();

现在,我正在尝试根据 name 字段对 jsonArrayOfJsonObjects 进行排序。

期望的输出:

[
  {"id":9,"name":"name9","valid":true},
  {"id":10,"name":"name10","valid":false},
  {"id":11,"name":"name11","valid":false},
  {"id":12,"name":"name12","valid":true}
]

任何人都可以用关于 Java 和 Gson 的最佳方法来帮助解决这个问题吗?
非常感谢您的意见。

【问题讨论】:

标签: java sorting gson


【解决方案1】:

首先,解析你的JSON的正确方法是创建一个类来封装你的数据,例如:

public class MyClass {
    private Integer id;
    private String name;
    private Boolean valid;
    //getters & setters
}

然后:

Type listType = new TypeToken<List<MyClass>>() {}.getType();
List<MyClass> myList = new Gson().fromJson(strArrayText, listType);

现在您有一个List,并且您想按属性id 的值对其进行排序,因此您可以按照here 的说明使用Collections

public class MyComparator implements Comparator<MyClass> {
    @Override
    public int compare(MyClass o1, MyClass o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

最后:

Collections.sort(myList, new MyComparator());

【讨论】:

  • 您还可以使用数组和 Java 8 lambda:MyClass[] objects = new Gson().fromJson(strArrayText, MyClass[].class); Arrays.sort(objects, (MyClass m1, MyClass m2) -&gt; m1.getId().compareTo(m2.getId()));
【解决方案2】:

尝试将此库方法作为简单的 JSON 级替代方法来创建模型类:

/**
 * Sort JSON-array by a given key name (numbers or text expected).
 *
 * @param jsonArray     JSON-array to sort.
 * @param keyNameToSort Key name to sort by. Expected are integer type 
 *                      (sorted ascending) or string type (sorted 
 *                      alphabetically).
 */
public static JsonArray
sortJsonArrayByKey(
  JsonArray jsonArray,
  String keyNameToSort) {

  JsonArray sortedJsonArray = new JsonArray();
  JsonObject jsonObject = null;
  int jsonElementIndex;
  TreeMap<Integer, JsonObject> integerSortedObjects = new TreeMap<>();
  TreeMap<String, JsonObject> stringSortedObjects = new TreeMap<>();

  for (
    jsonElementIndex = 0;
    jsonElementIndex < jsonArray.size();
    jsonElementIndex++) {

    try {

      // A JSON-Object from JSON-array:

      jsonObject =
        jsonArray
          .get(
            jsonElementIndex)
          .getAsJsonObject();

    } catch (Exception notAnObject) {
    }

    for (Entry<String, JsonElement> entry : jsonObject.entrySet()) {

      // Look for the given key in the JSON-object:

      if (
        entry.getKey()
        .equals(keyNameToSort)) {

        try {

          // If key is of integer type:

          integerSortedObjects.put(
            entry
              .getValue()
              .getAsInt(),
            jsonObject);

        } catch (Exception notAnInt) {

          try {

            // If key is of string type:

            stringSortedObjects.put(
              entry
                .getValue()
                .getAsString(),
              jsonObject);

          } catch (Exception neitherIntNorString) {
          }
        }
      }
    }
  }

  // Add sorted by number values first:

  for (Integer key : integerSortedObjects.keySet()) {

    sortedJsonArray.add(
      integerSortedObjects.get(
        key));
  }

  // Add sorted by string values second:

  for (String key : stringSortedObjects.keySet()) {

    sortedJsonArray.add(
      stringSortedObjects.get(
        key));
  }

  return sortedJsonArray;
}

【讨论】:

    【解决方案3】:

    你可以使用 Gson 库https://sites.google.com/site/gson/gson-user-guide 获取 Array(该类应实现可比较)并使用 arrays.sort() 进行排序;

    谢谢

    【讨论】:

    • 你能举个例子吗?
    • 答案中有示例,如果我必须对其进行编码,则代码将相同。
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2013-05-14
    • 1970-01-01
    • 2021-10-14
    • 2017-09-29
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多