将JSON对象中的某个字段进行分组和排序(java实现)

现在有这样一个数据

{
	"systemid": "123",
	"productid": "123",
	"dataArray": [
		{
			"line_num": 2,
			"subjectcodecv": 1,
			"subjectname": "公司",
			"subjectid": "1001",
			"resource_members_id": "003",
			"resource_members_name": "xx"
		}, {
			"line_num": 2,
			"subjectcodecv": 2,
			"subjectname": "产品",
			"subjectid": "10",
			"resource_members_id": "002",
			"resource_members_name": "11xx"
		}, {
			"line_num": 2,
			"subjectcodecv": 3,
			"subjectname": "产品",
			"subjectid": "10",
			"resource_members_id": "001",
			"resource_members_name": "22xx"
		}, {
			"line_num": 1,
			"subjectcodecv": 1,
			"subjectname": "公司",
			"subjectid": "1001",
			"resource_members_id": "005",
			"resource_members_name": "xx"
		}, {
			"line_num": 1,
			"subjectcodecv": 2,
			"subjectname": "产品",
			"subjectid": "10",
			"resource_members_id": "004",
			"resource_members_name": "11xx"
		}, {
			"line_num": 1,
			"subjectcodecv": 3,
			"subjectname": "产品",
			"subjectid": "10",
			"resource_members_id": "003",
			"resource_members_name": "22xx"
		}
	]
}

需求:将JSON字符串中的dataArray数组中的json对象按line_num字段进行分组,然后将每组中的json对象按照resource_members_id字段进行排序(后续还有对每组排序后的json对象进行业务操作,这里不做)

实现:

package com.feidao.test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * author: LN  create: 2019-05-23 09:40
 */
public class GroupByTest {
    public static void main(String[] args) {
        String jsonStr = "{\n" +
                "\t\"systemid\": \"123\",\n" +
                "\t\"productid\": \"123\",\n" +
                "\t\"dataArray\": [\n" +
                "\t\t{\n" +
                "\t\t\t\"line_num\": 2,\n" +
                "\t\t\t\"subjectcodecv\": 5,\n" +
                "\t\t\t\"subjectname\": \"公司\",\n" +
                "\t\t\t\"subjectid\": \"1001\",\n" +
                "\t\t\t\"resource_members_id\": \"003\",\n" +
                "\t\t\t\"resource_members_name\": \"xx\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"line_num\": 2,\n" +
                "\t\t\t\"subjectcodecv\": 4,\n" +
                "\t\t\t\"subjectname\": \"产品\",\n" +
                "\t\t\t\"subjectid\": \"10\",\n" +
                "\t\t\t\"resource_members_id\": \"002\",\n" +
                "\t\t\t\"resource_members_name\": \"11xx\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"line_num\": 2,\n" +
                "\t\t\t\"subjectcodecv\": 3,\n" +
                "\t\t\t\"subjectname\": \"产品\",\n" +
                "\t\t\t\"subjectid\": \"10\",\n" +
                "\t\t\t\"resource_members_id\": \"001\",\n" +
                "\t\t\t\"resource_members_name\": \"22xx\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"line_num\": 1,\n" +
                "\t\t\t\"subjectcodecv\": 3,\n" +
                "\t\t\t\"subjectname\": \"公司\",\n" +
                "\t\t\t\"subjectid\": \"1001\",\n" +
                "\t\t\t\"resource_members_id\": \"005\",\n" +
                "\t\t\t\"resource_members_name\": \"xx\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"line_num\":1,\n" +
                "\t\t\t\"subjectcodecv\": 1,\n" +
                "\t\t\t\"subjectname\": \"产品\",\n" +
                "\t\t\t\"subjectid\": \"10\",\n" +
                "\t\t\t\"resource_members_id\": \"004\",\n" +
                "\t\t\t\"resource_members_name\": \"11xx\"\n" +
                "\t\t}, {\n" +
                "\t\t\t\"line_num\": 1,\n" +
                "\t\t\t\"subjectcodecv\": 5,\n" +
                "\t\t\t\"subjectname\": \"产品\",\n" +
                "\t\t\t\"subjectid\": \"10\",\n" +
                "\t\t\t\"resource_members_id\": \"003\",\n" +
                "\t\t\t\"resource_members_name\": \"22xx\"\n" +
                "\t\t}\n" +
                "\t]\n" +
                "}";

        JSONObject originalJsonData = JSONObject.parseObject(jsonStr);
        JSONArray dataArray = originalJsonData.getJSONArray("dataArray");

        List<JSONObject> jsonObjectList = new ArrayList<>();
        //将原始数据中的json数组中的json对象存到一个list集合中
        for (Object o : dataArray) {
            jsonObjectList.add((JSONObject) o);
        }

        //对集合中的json对象进行分组
        //然后返回一个map集合,key代表组名,value代表该组中的数据
        Map<String, List<JSONObject>> groupByLineNumData = jsonObjectList.stream()
                .collect(Collectors.groupingBy(x -> x.getString("line_num")));

        //遍历所有的分组,对每组内的JSON对象进行排序
        for (String s : groupByLineNumData.keySet()) {
            List<JSONObject> list = groupByLineNumData.get(s);
            JSONArray jsonSorted = jsonArraySort(list.toString());
            //后续有对排序后的json对象的业务操作
            //这里只将它输出
            System.out.println(jsonSorted);
        }

    }

    /**
     * 对多个JOSN对象进行自定义字段排序
     *
     * @param jsonArrStr 要排序的JSON数据
     * @return 返回排序后的结果
     */
    private static JSONArray jsonArraySort(String jsonArrStr) {
        JSONArray jsonArr = JSON.parseArray(jsonArrStr);
        JSONArray sortedJsonArray = new JSONArray();
        List<JSONObject> jsonValues = new ArrayList<JSONObject>();
        //存放json数组中的每个json对象
        for (int i = 0; i < jsonArr.size(); i++) {
            jsonValues.add(jsonArr.getJSONObject(i));
        }

        //对集合中的JOSN对象进行自定义排序
        jsonValues.sort((a, b) -> {
            String valA = a.getString("resource_members_id");
            String valB = b.getString("resource_members_id");
            return valA.compareTo(valB);
        });

        for (int i = 0; i < jsonArr.size(); i++) {
            sortedJsonArray.add(jsonValues.get(i));
        }
        return sortedJsonArray;
    }
}

输出结果:

输出了两个排序好的JSON数组

line_num为1:

resource_members_id也排好序了

[
	{
		"subjectname": "产品",
		"resource_members_name": "22xx",
		"line_num": 1,
		"resource_members_id": "003",
		"subjectid": "10",
		"subjectcodecv": 5
	}, {
		"subjectname": "产品",
		"resource_members_name": "11xx",
		"line_num": 1,
		"resource_members_id": "004",
		"subjectid": "10",
		"subjectcodecv": 1
	}, {
		"subjectname": "公司",
		"resource_members_name": "xx",
		"line_num": 1,
		"resource_members_id": "005",
		"subjectid": "1001",
		"subjectcodecv": 3
	}
]

 line_num为2

resource_members_id也排好序了

[
	{
		"subjectname": "产品",
		"resource_members_name": "22xx",
		"line_num": 2,
		"resource_members_id": "001",
		"subjectid": "10",
		"subjectcodecv": 3
	}, {
		"subjectname": "产品",
		"resource_members_name": "11xx",
		"line_num": 2,
		"resource_members_id": "002",
		"subjectid": "10",
		"subjectcodecv": 4
	}, {
		"subjectname": "公司",
		"resource_members_name": "xx",
		"line_num": 2,
		"resource_members_id": "003",
		"subjectid": "1001",
		"subjectcodecv": 5
	}
]

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有如下的Json对象列表: ```json [ {"name": "Alice", "age": 28, "gender": "female"}, {"name": "Bob", "age": 25, "gender": "male"}, {"name": "Charlie", "age": 30, "gender": "male"}, {"name": "David", "age": 22, "gender": "male"}, {"name": "Emily", "age": 27, "gender": "female"}, {"name": "Frank", "age": 31, "gender": "male"}, {"name": "Grace", "age": 24, "gender": "female"}, {"name": "Henry", "age": 29, "gender": "male"}, {"name": "Ivy", "age": 26, "gender": "female"} ] ``` 我们可以通过Java代码将其按照gender字段分组,并按照age字段排序: ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONObject; public class Main { public static void main(String[] args) { String jsonStr = "[{\"name\":\"Alice\",\"age\":28,\"gender\":\"female\"},{\"name\":\"Bob\",\"age\":25,\"gender\":\"male\"},{\"name\":\"Charlie\",\"age\":30,\"gender\":\"male\"},{\"name\":\"David\",\"age\":22,\"gender\":\"male\"},{\"name\":\"Emily\",\"age\":27,\"gender\":\"female\"},{\"name\":\"Frank\",\"age\":31,\"gender\":\"male\"},{\"name\":\"Grace\",\"age\":24,\"gender\":\"female\"},{\"name\":\"Henry\",\"age\":29,\"gender\":\"male\"},{\"name\":\"Ivy\",\"age\":26,\"gender\":\"female\"}]"; JSONArray jsonArray = new JSONArray(jsonStr); Map<String, List<JSONObject>> groupMap = new HashMap<String, List<JSONObject>>(); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String gender = jsonObject.getString("gender"); if (!groupMap.containsKey(gender)) { groupMap.put(gender, new ArrayList<JSONObject>()); } groupMap.get(gender).add(jsonObject); } for (String gender : groupMap.keySet()) { List<JSONObject> groupList = groupMap.get(gender); Collections.sort(groupList, new Comparator<JSONObject>() { @Override public int compare(JSONObject o1, JSONObject o2) { int age1 = o1.getInt("age"); int age2 = o2.getInt("age"); return age1 - age2; } }); System.out.println("Gender: " + gender); for (JSONObject jsonObject : groupList) { System.out.println(jsonObject.toString()); } } } } ``` 运行结果如下: ``` Gender: male {"name":"David","age":22,"gender":"male"} {"name":"Bob","age":25,"gender":"male"} {"name":"Charlie","age":30,"gender":"male"} {"name":"Henry","age":29,"gender":"male"} {"name":"Frank","age":31,"gender":"male"} Gender: female {"name":"Grace","age":24,"gender":"female"} {"name":"Emily","age":27,"gender":"female"} {"name":"Ivy","age":26,"gender":"female"} {"name":"Alice","age":28,"gender":"female"} ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值