将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
}
]
将JSON对象中的某个字段进行分组和排序(java实现)相关推荐
- mongodb 如何删除 字段值为 json对象中的某个字段值
例如: { attributes: { birthday:'1988-01-01', name: 'aq' } } birthday是attributes字段的value的一个字段, 我要删除birt ...
- 使用Jackson忽略JSON对象上的新字段[复制]
本文翻译自:Ignoring new fields on JSON objects using Jackson [duplicate] This question already has an ans ...
- XE3随笔6:SuperObject 的 JSON 对象中还可以包含 方法
SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: IS ...
- 检查密钥是否存在于json对象中
本文翻译自:Check if a key exists inside a json object amt: "10.00" email: "sam@gmail.com&q ...
- JSON对象中的函数调用,JSON格式的字符串对应的函数调用方法
json对象中的函数调用:直接使用 json变量名+函数名+()进行调用,特别注意这对括号:如果是获取到的json格式的字符串,想要调用它的方法前,需要先将该字符串转换成json对象,在调用对应的方法 ...
- 如何替换json对象中的key
来源 | https://www.cnblogs.com/jaxu/archive/2021/06/01/14836088.html 看到标题你可能会想,如此简单的问题值得去探究吗?如果我有一个jso ...
- JS-JSON-获取JSON对象中的数据展示到表格里
JS-JSON-获取JSON对象中的数据展示到表格里 1.要求 点击按钮,将学生信息展示到表格里,并显示总记录条数. 2.实现思路 创建JSON对象 先创建一个JSON对象data,有总人数total ...
- 移除Java对象中的属性_移除/添加 JSON对象中的某个属性
因为JSON完全是动态的,所以给一个JSON对象添加一个属性是很简单的,如: var json = {}; json.username='xtayfjpk'; 这样就为json对象添加了一个名为use ...
- JS 遍历JSON对象中的键值对
对象:一组无序属性的集合,属性的值可以是任意的类型: json也是对象,数据都是成对的,也就是键值对: json实际上就是一组格式化后的字符串数据. 遍历JSON对象中的数据,可通过for-in循环实 ...
最新文章
- 从事GIS开发多年,2017年对GIS行业的心得,尤其对三维GIS的理解
- Android5.1修改以太网MAC地址(SElinux)【转】
- 如何查看抓包文件所使用的捕获过滤器
- NuGet的本地服务器安装与Package的发布(呕吐)
- CSS学习17之动画
- 学习、纪律与交流——《Clean Coder》读后感
- 记录一下SpringCloud-Gateway使用lb动态路由遇到的坑
- 敏捷测试与传统测试的区别
- 化学实验中计算机技术的应用,浅谈计算机在基础化学实验中的应用
- JAVA学习之 Model2中的Servlet与.NET一般处理程序傻傻分不清楚
- VS C++ 字符大写变换 字符小写变换 tolower toupper
- java severlet 例子_Java开发Servlet实例
- 电脑通过android手机上网
- 装系统提示缺少计算机所需的介质驱动程序,win8系统UEFi安装提示“缺少计算机所需的介质驱动程序”的图文步骤...
- 二层交换机与三层交换机交换原理
- VS安装包下载和环境配置
- Android 闹钟app 课程设计
- 项目依赖aar 以及 依赖嵌套aar
- iOS YYModel使用方法
- http请求 状态码204
热门文章
- 独立站现在好不好做?个人适合做跨境电商独立站吗?
- 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。...
- 1、Fiddler的基本介绍
- 计算机科学与技术素材,计算机科学与技术ppt素材
- python找第二大的数索引_python – 在numpy数组中查找多个值的行索引
- php用户注册重复_php如何禁止重复注册用户名
- vba 保存word里面的图片_笔记7 【office精华课】一套课程学会Word+Excel+PPT(一)【Word】(2020年第37周 周五)...
- SpringBoot实战教程(4)| 整合Mybatis
- EclipseLink+H2 快速搭建JPA开发环境
- [Ext JS 7]7.2 事件(Event)