簡體   English   中英

使用GSON按變量鍵對JsonArray進行排序

[英]Sort JsonArray by variable key using GSON

我正在嘗試使用GSON對Java中的JsonArray進行排序,我想通過變量鍵對數組中的所有內容進行排序,這意味着在某處包含一個字符串,其中包含一些需要作為對象排序依據的鍵。

鍵變量: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}]

請嘗試以下操作:

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. 從JSONArray創建Java ArrayList。

  3. 使用Collections.sort()對Java ArrayList進行排序

  4. 然后從Java ArrayList創建JSONArray。

  5. 然后返回JSONArray作為JSON字符串表示形式。

好吧,您可以僅實現一個專門針對Gson JsonElement的排序算法。 如果不是這樣,您可以只重復使用標准的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只是jsonElements的視圖, jsonArray jsonArray實際上已排序。

以下示例使用Google Gson庫-唯一棘手的部分是告訴該庫解析數組。

另外,為您的json序列化數據定義類型( Item類)可以更輕松地通過代碼與其進行交互。

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 + "]";
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM