Java 处理 json 格式数据解析为 csv 格式

Java处理json格式数据解析为csv格式

如果不使用 JSON 工具库,你可以手动解析 JSON 格式字符串并将其转换为 CSV 格式字符串。
以下是一个简单示例,展示如何实现这一功能。

示例代码
下面的示例代码手动处理 JSON 字符串,将其转换为 CSV 格式字符串:

 /*** 接收 JSON 字符串,去掉开头和结尾的方括号,按对象划分。* 通过 extractKeys 方法提取字段名,添加到 CSV 的第一行。* 逐项解析 JSON 对象,并通过 extractValues 获取对应的值,添加到 CSV 的后续行。** @param jsonString json格式字符串* @param header     输出是否包含头标题 true包含 false不包含* @return csv 格式字符串*/public static String convertJsonToCsv(String jsonString, boolean header) {StringBuilder csvBuilder = new StringBuilder();// 假设 JSON 是一个数组的形式if (jsonString.startsWith("[") && jsonString.endsWith("]")) {// 去掉开头和结尾的方括号jsonString = jsonString.substring(1, jsonString.length() - 1).trim();String[] jsonObjects = jsonString.split("},\\s*\\{"); // 按对象划分// 处理第一项获取字段名if (header) {String[] keys = extractKeys(jsonObjects[0]);csvBuilder.append(String.join(",", keys)).append("\n");}// 逐个处理 JSON 对象for (String jsonObject : jsonObjects) {jsonObject = jsonObject.replaceAll("[{}\"]", ""); // 去掉大括号和双引号String[] values = extractValues(jsonObject);csvBuilder.append(String.join(",", values)).append("\n");}} else {// 处理第一项获取字段名if (header) {String[] keys = extractKeys(jsonString);csvBuilder.append(String.join(",", keys)).append("\n");}String[] values = extractValues(jsonString);csvBuilder.append(String.join(",", values)).append("\n");}return csvBuilder.substring(0, csvBuilder.length() - 1);}/*** 提取 JSON 对象的键,通过分隔符将 JSON 对象的属性解析成键的字符串数组。** @param jsonString json格式字符串* @return JSON 对象的键*/public static String[] extractKeys(String jsonString) {String[] parts = jsonString.split(",");String[] keys = new String[parts.length];for (int i = 0; i < parts.length; i++) {keys[i] = parts[i].split(":")[0].trim().replace("{", "").replace("}", "").replace("\"", "");}return keys;}/*** 提取 JSON 对象的键,通过分隔符将 JSON 对象的属性解析成键的字符串数组。** @param jsonString json格式字符串* @return JSON 对象的键字符串*/public static String extractKeysToString(String jsonString) {String[] values = extractKeys(jsonString);return String.join(",", values);}/*** 提取 JSON 对象的值,根据键的顺序,从 JSON 对象中对应地提取值。** @param jsonString json格式字符串* @return JSON 对象的值*/public static String[] extractValues(String jsonString) {String[] parts = jsonString.split(",");String[] values = new String[parts.length];for (int i = 0; i < parts.length; i++) {String value = parts[i].split(":")[1].trim().replace("{", "").replace("}", "").replace("\"", "");values[i] = value; // 此处直接取值,假设没有嵌套和特殊字符}return values;}/*** 提取 JSON 对象的值,根据键的顺序,从 JSON 对象中对应地提取值。** @param jsonString json格式字符串* @return JSON 对象的值字符串*/public static String extractValuesToString(String jsonString) {String[] values = extractValues(jsonString);return String.join(",", values);}public static void main(String[] args) {String json = "[{\"省份\":\"北京\",\"大学数量\":\"50\",\"大专数量\":\"80\",\"中专数量\":\"120\"}," +"{\"省份\":\"上海\",\"大学数量\":\"45\",\"大专数量\":\"75\",\"中专数量\":\"110\"}]";String string = "{\"省份\":\"北京\",\"大学数量\":\"50\",\"大专数量\":\"80\",\"中专数量\":\"120\"}";System.out.println(Arrays.toString(extractKeys(string)));System.out.println(Arrays.toString(extractValues(string)));System.out.println(extractKeysToString(string));System.out.println(extractValuesToString(string));String csvOutputWithHeader = convertJsonToCsv(json, true);System.out.println("csvOutputWithHeader:\n" + csvOutputWithHeader);String csvOutputNoHeader = convertJsonToCsv(json, false);System.out.println("csvOutputNoHeader:\n" + csvOutputNoHeader);}

测试数据结果:

[省份, 大学数量, 大专数量, 中专数量]
[北京, 50, 80, 120]
省份,大学数量,大专数量,中专数量
北京,50,80,120
csvOutputWithHeader:
省份,大学数量,大专数量,中专数量
北京,50,80,120
上海,45,75,110
csvOutputNoHeader:
北京,50,80,120
上海,45,75,110

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+智谱AI-实现钉钉消息自动回复

python智谱AI-实现钉钉消息自动回复 实现了电脑窗口切换&#xff0c;截图识别未读消息&#xff0c;与语言模型交互后&#xff0c;将答案带入到钉钉窗口中。偷个懒&#xff0c;直接贴代码了&#xff0c;后续不断完善注释&#xff0c;如果遇到读不懂的地方&#xff0c;欢迎交流。…

贪心算法day3(最长递增序列问题)

目录 1.最长递增三元子序列 2.最长连续递增序列 1.最长递增三元子序列 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们只需要设置两个数进行比较就好。设a为nums[0]&#xff0c;b 为一个无穷大的数&#xff0c;只要有比a小的数字就赋值…

Javascript如何获取指定网页中的内容?

这两天有一个需求&#xff0c;就是通过JS去获取网页的内容&#xff0c;当然&#xff0c;除了今天我要分享的这个方法以外&#xff0c;其实通过Ajax的Get方法也是可以实现这个功能的&#xff0c;但是Ajax就比较麻烦一些了&#xff0c;如果只是单纯的想要获取一下纯内容&#xff…

在CentOS7传统部署wordpress

1 环境准备 所需环境说明CentOS7.9ip地址&#xff1a;10.0.0.7&#xff0c;可以上网PHP72系列软件下面会介绍MySQL数据库暴露端口3306&#xff0c;用户wordpress&#xff0c;库wordpressnginx版本任意wordpres v6.5.2代码下载地址&#xff1a;https://cn.wordpress.org/wordpr…

文献阅读 | Nature Methods:使用 STAMP 对空间转录组进行可解释的空间感知降维

文献介绍 文献题目&#xff1a; 使用 STAMP 对空间转录组进行可解释的空间感知降维 研究团队&#xff1a; 陈金妙&#xff08;新加坡科学技术研究局&#xff09; 发表时间&#xff1a; 2024-10-15 发表期刊&#xff1a; Nature Methods 影响因子&#xff1a; 36.1&#xff0…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…

GA/T1400视图库平台EasyCVR多品牌摄像机视频平台前端监控摄像头镜头的基础知识

在现代安全监控系统中&#xff0c;摄像机镜头作为捕捉图像的关键组件&#xff0c;其选择和应用直接影响到监控图像的质量和系统的整体性能。随着技术的发展&#xff0c;摄像机镜头的种类和功能也在不断扩展&#xff0c;以适应各种复杂的监控环境和需求。对于相机成像来讲&#…

省级数字经济发展水平数据(2011-2022年)

数字经济是指以数据资源为关键要素&#xff0c;以现代信息网络为主要载体&#xff0c;以信息通信技术融合应用、全要素数字化转型为重要推动力&#xff0c;促进公平与效率更加统一的新经济形态。 2011-2022年省级数字经济发展水平数据&#xff08;&#xff09;.zip资源-CSDN文…

PostGreSQL接入Prometheus

postgres_exporter包 https://github.com/prometheus-community/postgres_exporter/tree/master 启动 [program:postgres] command/opt/proms/postgres_exporter/postgres_exporter environmentDATA_SOURCE_NAME"postgresql://postgres:xxxx-bi.cv02mbuo4ins.us-east-1.…

【WRF模拟】全过程总结:WPS预处理及WRF运行

【WRF模拟】全过程总结:WPS预处理及WRF运行 1 数据准备1.1 嵌套域设置(Customize domain)-基于QGis中gis4wrf插件1.2 静态地理数据1.2.1 叶面积指数LAI和植被覆盖度Fpar(月尺度)1.2.2 地面反照率(月尺度)1.2.3 土地利用类型+不透水面积1.2.4 数据处理:geotiff→tiff(W…

银行家算法(模拟)

银行家算法是一种避免死锁的有效算法&#xff0c;它借鉴了银行家贷款的策略。在分配资源之前&#xff0c;银行家会检查系统是否有足够的资源满足进程的最大需求&#xff0c;若有&#xff0c;则暂时分配资源&#xff0c;然后继续检查剩余资源是否足够满足其他进程的最大需求。只…

「QT」几何数据类 之 QSizeF 浮点型尺寸类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

L1-021 重要的话说三遍

一、问题描述 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “Im gonna WIN!”——连续输出三遍就可以了。 注意每遍占一行&#xff0c;除了每行的回车不能有任何多余字符。 1. 输入样例 无 2. 输出样例 Im gonna WIN! Im gonna WIN! Im gonna WIN! 二…

【动手学电机驱动】STM32-FOC(3)STM32 三路互补 PWM 输出

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

数据库DQL

DQL 语法 SELECT字段列表 FROM表名列表 WHERE条件列表 GROUP BY分组字段列表 HAVING分组后条件列表 ORDER BY排序字段列表 LIMIT分页参数 基本查询 查询多个字段 SELECT 字段1,字段2,字段3,... FROM 表名; SELECT * FROM 表名; 设置别名 SELECT 字段1 [AS 别名1],字段2 …

Spark中的shuffle

Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。 1、Spark的Shuffle设计 Spark Shuffle过程也叫作宽依赖过程&#xff0c;Spark不完全依赖于内存计算&#xff0c;面临以上问题时&#xff0c;也需要Shuffle过程。 2、Spark中哪…

ffmpeg 视频滤镜:屏蔽边框杂色- fillborders

滤镜描述 fillborders 官网链接 > FFmpeg Filters Documentation fillborders滤镜有几种方式帮你屏蔽边框的杂色、不好的图案。 滤镜使用 参数 left <int> ..FV.....T. set the left fill border (from 0 to INT_MAX) (default 0)right …

「C/C++」C++标准库 之 #include<iostream> 标准输入输出

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

智能合约在供应链金融中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 引言 智能合约概述 定义与原理 发展…

前端实现文件下载常用几种方式

项目中前端下载一般分为两种情况&#xff1a; 后端直接提供一个文件地址&#xff0c;通过浏览器打开就可以下载。需要发送请求&#xff0c;后端返回二进制流数据&#xff0c;前端解析流数据&#xff0c;生成URL实现下载。 前端对应的实质是a标签和Blob文件下载&#xff0c;这…