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

devtools/2024/11/14 17:55:46/

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

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

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

java"> /*** 接收 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.ppmy.cn/devtools/132790.html

相关文章

3. ARM_寄存器组织

概述 什么是寄存器&#xff1a; 寄存器是CPU内部的存储器&#xff0c;没有地址。寄存器用于暂时存放参与运算的数据和运算结果。寄存器包括通用寄存器、专用寄存器、控制寄存器。 通用寄存器&#xff1a;可以存取的数据不受限制 &#xff0c;什么都可以存。专用寄存器&#…

js id数组转字符串

在 JavaScript 中&#xff0c;将数组转换为字符串有几种常见的方法。每种方法都有其特定的用途和格式。以下是一些常用的方法&#xff1a; 1. Array.prototype.join(separator) join 方法将数组的所有元素连接成一个字符串&#xff0c;并使用指定的分隔符&#xff08;默认为逗…

基于promtail+loki+grafana搭建日志系统

文章目录 Promtail安装promtail创建配置文件创建systemd 服务文件启动promtail服务 loki下载loki服务创建config.yml文件创建systemd服务文件启动loki grafana下载grafana 本文基于promtaillokigrafanaprometheus&#xff08;可选&#xff09; 搭建一个轻量快速的日志系统&…

ReactPress系列—Next.js 的动态路由使用介绍

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;感谢Star。 Next.js 的动态路由使用介绍 Next.js 是一个流行的 React 框架&#xff0c;支持服务端渲染、静态站点生成和动态路由等功能&#xff0c;极大地简化…

python 爬虫 入门 六、Selenium

Selenium本来是一个自动测试工具&#xff0c;用于模拟用户对网站进行操作。在爬虫领域也有其用处。 一、下载安装Selenium及附属插件 pip install Selenium 安装完成后还需要安装一个浏览器驱动&#xff0c;来让python能启动浏览器。 如果是Edge或者其他基于Chromium的浏览器…

chrony服务器(linux)

简介 重要性 由于IT系统中&#xff0c;准确的计时非常重要&#xff0c;有很多种原因需要准确计时&#xff1a; 在网络传输中&#xff0c;数据包括和日志需要准确的时间戳 各种应用程序中&#xff0c;如订单信息&#xff0c;交易信息等 都需要准确的时间戳 Linux的两个时钟 …

布谷直播系统开发运营推广代理后台功能分析

布谷直播系统开发代理后台&#xff1a; 1、代理分为三级&#xff08;平台本身除外&#xff09;平台可以添加运营中心&#xff0c;代理&#xff08;二级&#xff09;和经纪人&#xff08;三级&#xff09; 2、平台可以看到所有的信息&#xff0c;包括修改下面运营中心、代理、经…

『Django』初识DRF

点赞 + 关注 + 收藏 = 学会了 本文简介 上一讲《『Django』初识前后端分离》https://mp.weixin.qq.com/s/kvhX8pePKbrS7z9fncT0mA 介绍了在 Django 中如何给前端写接口。如果有跟着动手做的工友一定会发现,这样写接口实在太麻烦了,还容易出错。显然大家都意识到这个问题,于…