java stream SONObject和JSONArray操作

2023-11-04

转自:https://zhuanlan.zhihu.com/p/36865573

1 取最后一条数据

stream对象存在方法findFirst,我们可以很方便的取到第一条数据,但它却没有findLast方法,需要取到最后一条数据,我们可以将数组逆序,然后再取最后一条数据:

JSONArray jsonArray = JSONArray.parseArray("[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]");
JSONObject jsonObject = (JSONObject)jsonArray.stream().sorted((a,b) -> -1).findFirst().get();
System.out.println(jsonObject);
/**
* out :
*      {"date":"2016-01-01","sex":"woman","name":"liming"}
**/

2 清空json对象中的某个数组(该数组位于JSON对象内部多层)

SONObject jsonObject = JSONObject.parseObject("{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}");
jsonObject.forEach((key, val) -> {
    JSONObject obj = (JSONObject) val;
    JSONArray array = obj.getJSONArray("childrens");
    array.clear();
    obj.put("childrens",array);
});
System.out.println(jsonObject);
/**
* out :
*      {"1":{"childrens":[],"sex":"man","name":"maple"}}
**/

3 收集对象属性重新成一个数组

有时候我们需要对对象进行再次拼装以形成我们方便使用的数据状态:

JSONArray jsonArray = JSONArray.parseArray("[{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}]");
jsonArray = jsonArray.stream().map(obj -> {
JSONObject returnObj = new JSONObject();
    JSONObject jsonObj = (JSONObject)obj;
    jsonObj.forEach((key,val) -> {
        returnObj.put(key,((JSONObject)val).getJSONArray("childrens"));
    });
    return returnObj;
}).collect(Collectors.toCollection(JSONArray::new));
System.out.println(jsonArray);
/**
* out :
*      [{"1":[{"date":"2018-01-01","sex":"man","name":"草根"},{"date":"2017-01-01","sex":"woman","name":"merry"},{"date":"2016-01-01","sex":"woman","name":"liming"}]}]
**/

4 过滤数据并按时间字符串排序

 

JSONObject jsonObject = JSONObject.parseObject("{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Comparator<Object> dateComparator = (a, b) -> {
    int result = 0;
    try {
         Date dt1 = df.parse(((JSONObject)a).getString("date"));
         Date dt2 = df.parse(((JSONObject)b).getString("date"));
         result = dt1.compareTo(dt2);
    } catch (Exception ex) {
         ex.printStackTrace();
    } finally {
          return result;
    }
};
jsonObject.forEach((key, val) -> {
    JSONObject obj = (JSONObject) val;
    if (obj.getJSONArray("childrens") != null) {
          JSONArray array = obj.getJSONArray("childrens");
          array = array.stream().filter(arrObj -> !"merry".equals(((JSONObject) arrObj).getString("name")))
                  .sorted(dateComparator)
                  .collect(Collectors.toCollection(JSONArray::new));
          obj.put("childrens", array);
    } else {
            obj.put("childrens", new JSONArray());
    }
});
System.out.println(jsonObject);
/**
* out :
*      {"1":{"childrens":[{"date":"2016-01-01","sex":"woman","name":"liming"},{"date":"2018-01-01","sex":"man","name":"草根"}],"sex":"man","name":"maple"}}
**/

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java stream SONObject和JSONArray操作 的相关文章

随机推荐

  • R语言中的取整函数

    R语言中的取整函数 用来取整的四个函数 ceiling floor round trunc 注意四者的区别 ceiling 英文解释 ceiling takes a single numeric argument x and returns
  • 音视频剪辑 DIY:用 Python 快速入门音视频剪辑

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 在这个短视频和自媒体大行其道的年代 音视频剪辑成为了大佬们的必备工具 现在有很多音视频剪辑的软件 如剪映 Camtasia 爱拍剪辑
  • 软件分析笔记——数据流

    热烘烘的第三篇来啦 dbq 我看的太慢了 断断续续拖了好几天才看完了 这篇文章是B站南大 软件分析 课的第三节 第四节的总和 由于这两节课讲的都是数据流 有连贯性 就一起看做了笔记 再次要感谢南大的李越老师 讲的真的太仔细 太到位了 之前上
  • vulnhub靶机Me and My Girlfriend : 1-Writeup渗透测试

    一 信息收集 打开靶机后 先用netdiscover进行IP扫描 确定靶机IP为192 168 1 106后 扫描它的端口开放情况 namp sV A p 0 65535 192 168 1 106 发现靶机只开放了22和80端口 打开80
  • Matlab-SVM分类器

    支持向量机 Support Vector Machine SVM 可以完成对数据的分类 包括线性可分情况和线性不可分情况 1 线性可分 首先 对于SVM来说 它用于二分类问题 也就是通过寻找一个分类线 二维是直线 三维是平面 多维是超平面
  • Python出现TypeError: __init__() got an unexpected keyword argument ‘threshold‘

    可能是layoutparse版本下载错误 在PaddleOCR README ch md at release 2 3 PaddlePaddle PaddleOCR GitHub 下载正确版本
  • Python爬虫(九)

    scrapy框架 定义 异步处理框架 可配置和可扩展程度非常高 Python中使用最广泛的爬虫框架 安装 Ubuntu安装 1 安装依赖包 1 sudo apt get install libffi dev 2 sudo apt get i
  • 【Ubuntu】将Qt程序打包制作成deb

    1 打包Qt程序 1 1 下载linuxdeployqt 如果使用环境是x86可以直接下载 下载地址 https github com probonopd linuxdeployqt releases 如果使用环境是嵌入式 需要下载linu
  • 程序员面试题目:请实现一个函数,把字符串中的每个空格替换成"20"。

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1223 题目 请实现一个函数 把字符串中的每个空格替换成 20 例如输入 We are happy 则输出 We 20are 20happy
  • C语言系列:2、数据类型、运算符和表达式

    C语言系列 2 数据类型 运算符和表达式 文章目录 C语言系列 2 数据类型 运算符和表达式 1 前言 2 变量名 3 数据类型和长度 3 1 基本数据类型 3 2 short和long限定符 3 3 signed 与unsigned限定符
  • (三)运行微信小程序:在主页加入扫码组件

    制作了多个页面后 我们试图在小程序中添加些其他功能 比如实现扫码功能 1 在二维码生成网站上 生成一张二维码或条形码照片 百度 二维码生成 即可找到生成网站 这里我们使用 2023你好吗 数字加文字的形式生成如下二维码 并保存到本地 供后续
  • OpenCV获取摄像头编号及名称

    欢迎使用Markdown编辑器 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何使用Markdown编辑器 可以仔细阅读这篇文章 了解一下Markdown的基本语法知识 方法 OpenCV的VideoCapt
  • Github 项目托管

    为了方便代码的管理 可以使用 github 来托管我们的项目 把每次更新的代码放到 github 上还能够提高代码的共享性 首先需要注册并登我们的 github 账号 https github com 新建仓库 New repository
  • DataPipeline如何实现数据质量管理

    数据质量管理已经成为数据治理的重要组成部分 高质量的数据是企业进行决策的重要依据 DataPipeline数据质量平台整合了数据质量分析 质量校验 质量监控等多方面特性 以保证数据质量的完整性 一致性 准确性及唯一性 帮助企业解决在数据集成
  • vue+webpack实现异步组件加载

    8 9更新 之前想搬迁到csdn的时候由于邀请码问题迟迟没把博客转过来 所以跑去博客园了 今天发现csdn已经帮我把文章搬过来 有必要修正一下这篇文章 写这篇文章的时候因为刚接触vue 所以捣鼓的时候有些迷糊 以下可以跳过 本来很简单的事情
  • Centos8 Failed to download metadata for repo ‘AppStream‘解决

    1 这个问题主要原因是 CentOs Linux 8 从 2021 10 31 号后已经停止维护 CentOS 8 将不再从 CentOS 官方项目获得开发资源 所以之后更新镜像需要通过 vault centos org来获取更新 2 进入
  • 无向图的表示:邻接矩阵和邻接表

    这里将一个无向图用邻接表和邻接矩阵表示 输入 顶底个数n 图中的各个边 用两个顶点表示 输出 这个无线图的邻接矩阵和邻接表 其中邻接表中的链接按元素大小升序排列 先给出一个例子说明 假设有无向图如下 则其邻接矩阵和邻接表如提示框中所示 其实
  • javaweb项目实战(附有源码)

    这个代码是我做微信小程序的时候 专门用java做的web项目 主要是为前端提供接口 便于前端调用数据 如果有想要参考javaweb项目如何做的小伙伴 可以到github上下载 github上有前端和后端代码 在wiki上还有表结构和接口文档
  • VIM 点滴积累

    删除列 1 光标定位到要操作的地方 2 CTRL v 进入 可视 块 模式 选取这一列操作多少行 3 d 删除 插入列 插入操作的话知识稍有区别 例如我们在每一行前都插入 1 光标定位到要操作的地方 2 CTRL v 进入 可视 块 模式
  • java stream SONObject和JSONArray操作

    转自 https zhuanlan zhihu com p 36865573 1 取最后一条数据 stream对象存在方法findFirst 我们可以很方便的取到第一条数据 但它却没有findLast方法 需要取到最后一条数据 我们可以将数