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

博客围绕JSON数据处理需求展开,要将JSON字符串中dataArray数组里的json对象按line_num字段分组,再把每组中的json对象按resource_members_id字段排序,最后输出了两个排序好的JSON数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在有这样一个数据

{
	"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
	}
]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值