最近遇到一个这样的需求。
要对JSONArray数组根据,根据JSONObject中某个key的值,按照自定义key值顺序重新排序
一个JSONArray数组,里面是JSONObject,JSONObject存放了很多(key,value);
类似与
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
现在要对JSONArray数组根据JSONObject中某个key的值,按照自定义key值重新排序
例如
JSONArray buttonlist = new JSONArray();
JSONObject groupitem1 = new JSONObject();
groupitem1.put("title", "保存");
groupitem1.put("onclick", "compareText();");
groupitem1.put("key", "compareText");
groupitem1.put("isshow", true);
buttonlist.add(groupitem1);
groupitem1 = new JSONObject();
groupitem1.put("title", "撤回");
groupitem1.put("onclick", "backToForm();");
groupitem1.put("key", "backToForm");
groupitem1.put("isshow", true);
buttonlist.add(groupitem1);
groupitem1 = new JSONObject();
groupitem1.put("title", "提交");
groupitem1.put("onclick", "openLocalFile();");
groupitem1.put("key", "openLocalFile");
groupitem1.put("isshow", true);
buttonlist.add(groupitem1);
String buttonlistJson = JSON.toJSONString(buttonlist);
print(buttonlistJson);
现有顺序输出:
[{"isshow":true,"onclick":"compareText();","title":"保存","key":"compareText"},
{"isshow":true,"onclick":"backToForm();","title":"撤回","key":"backToForm"},
{"isshow":true,"onclick":"openLocalFile();","title":"提交","key":"openLocalFile"}]
如果我们想根据自己对title值进行排序。
比如撤回、提交、保存这样排序应该如何做。
查了很久,没有看到相关的处理办法。只有对数字或者字母进行正序、逆序的办法。
我也没有想到很好的解决办法,只能另辟蹊径,想了一个歪门邪道
逻辑是:
把想要的排序,转换成数组,替换到对应JSONObject中去。然后再用数字进行正序排序。
代码例如下:
public static void main(String[] args){
//注:上面已有代码没有写过来,请自行查看
String[] arr = Util.TokenizerStringNew("撤回、提交、保存",",");
//在buttonlist JSON字符串中添加新的索引 key=id
for(int i=0,j=arr.length; i<j; i++){
buttonlistJson = buttonlistJson.replaceAll("\""+arr[i]+"\"","\""+arr[i]+"\",\"id\":\""+i+"\"");
}
print("===1==="+buttonlistJson);
/*输出为了方便查看加了换行
===1===
[{"isshow":true,"onclick":"compareText();","title":"保存","id":"2","key":"compareText"},
{"isshow":true,"onclick":"backToForm();","title":"撤回","id":"0","key":"backToForm"},
{"isshow":true,"onclick":"openLocalFile();","title":"提交","id":"1","key":"openLocalFile"}]
*/
//重新排序
String buttonlistJsonSort = jsonArraySort(buttonlistJson);
print("===2==="+buttonlistJsonSort);
/*输出为了方便查看加了换行
===2===
[{"isshow":true,"onclick":"backToForm();","title":"撤回","id":"0","key":"backToForm"},
{"isshow":true,"onclick":"openLocalFile();","title":"提交","id":"1","key":"openLocalFile"},
{"isshow":true,"onclick":"compareText();","title":"保存","id":"2","key":"compareText"}]
*/
//如果不能有别的key,value数据,在用替换等方法去除就好
JSONArray newButtonlist = JSONArray.parseArray(buttonlistJsonSort);
}
/**
* 按照JSONArray中的对象的某个字段进行排序(采用fastJson)
* @param jsonArrStr json数组字符串
*
*/
public static String jsonArraySort(String jsonArrStr) {
JSONArray jsonArr = JSON.parseArray(jsonArrStr);
JSONArray sortedJsonArray = new JSONArray();
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < jsonArr.size(); i++) {
jsonValues.add(jsonArr.getJSONObject(i));
}
Collections.sort(jsonValues, new Comparator<JSONObject>() {
// 如果你想按key排序
private static final String KEY_NAME = "id";
@Override
public int compare(JSONObject a, JSONObject b) {
String valA = new String();
String valB = new String();
try {
// 这里是a、b需要处理的业务
valA = a.getString(KEY_NAME);
valB = b.getString(KEY_NAME);
} catch (JSONException e) {
// do something
}
// 设置排序规则
//正序
return valA.compareTo(valB);
//逆序 -valA.compareTo(valB);
}
});
for (int i = 0; i < jsonArr.size(); i++) {
sortedJsonArray.add(jsonValues.get(i));
}
return sortedJsonArray.toString();
}
排序后的数据
输出为了方便查看加了换行
===2===
[{"isshow":true,"onclick":"backToForm();","title":"撤回","id":"0","key":"backToForm"},
{"isshow":true,"onclick":"openLocalFile();","title":"提交","id":"1","key":"openLocalFile"},
{"isshow":true,"onclick":"compareText();","title":"保存","id":"2","key":"compareText"}]
如此我们就另辟蹊径对一个json数组,按照我们自定义的key-value值进行了重新排序
如果有正经的办法还请大佬不吝赐教