Java 如何基于密钥对GSON数组进行排序?
考虑以下是我的数组Java 如何基于密钥对GSON数组进行排序?,java,sorting,gson,Java,Sorting,Gson,考虑以下是我的数组 [ {"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
[
{"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的问题向best apporach寻求帮助?非常感谢您的投入。您可以使用Gson库 获取数组(类应实现Compariable)并使用Array.sort()进行排序
首先,解析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);
最后:
Collections.sort(myList, new MyComparator());
尝试将此库方法作为创建模型类的一个简单的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;
}
/**
*按给定的键名(需要数字或文本)对JSON数组进行排序。
*
*@param jsonArray JSON数组进行排序。
*@param keyname排序要排序的关键字名称。应为整数类型
*(按升序排序)或字符串类型(按升序排序)
*(按字母顺序排列)。
*/
公共静态JsonArray
sortJsonArrayByKey(
JsonArray JsonArray,
字符串keyNameToSort){
JsonArray sortedJsonArray=新的JsonArray();
JsonObject JsonObject=null;
int-jsonElementIndex;
TreeMap integerSortedObjects=新的TreeMap();
TreeMap stringSortedObjects=新TreeMap();
为了(
jsonElementIndex=0;
jsonElementIndex
可能重复的@MattBallJsonArray
不是一个集合
,以避免不必要地进行大量对象翻译。@如果我理解正确,chrylis对列表进行排序,然后将其序列化为JSON应该会产生所需的输出。也许OP真的只是想要一个排序的JSONArray
,但我把它理解为要求排序的JSON。你能提供一个例子吗?答案中有一个例子,如果我必须对它进行编码,代码将是相同的。你也可以使用数组和Java 8 lambdas:MyClass[]objects=new Gson().fromJson(strArrayText,MyClass[].class);sort(对象,(MyClass m1,MyClass m2)->m1.getId().compareTo(m2.getId())代码>
/**
* 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;
}