如何对JSONArray数组根据自定义的key-value值进行重新排序

最近遇到一个这样的需求。

要对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值进行了重新排序

如果有正经的办法还请大佬不吝赐教

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值