当前位置: 首页 > article >正文

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.kler.cn/a/387984.html

相关文章:

  • 对称加密与非对称加密:密码学的基石及 RSA 算法详解
  • 【前端】深入浅出的React.js详解
  • 什么是 Real-Time Factor (RTF)
  • linux,1.NFS和autofs,2.podman容器,3.http服务和虚拟web主机,4.内网DNS服务搭建
  • 智慧仓储物流可视化平台
  • 容器docker的ulimit
  • 在React项目中配置@作为路径别名
  • 企业资产管理:SpringBoot技术实践
  • 安卓智能指针sp、wp、RefBase浅析
  • vue3学习:查询城市天气预报案例(vite组合式实现)
  • 【docker】6. 镜像仓库/镜像概念
  • 【前端】Svelte:组件间通信
  • Mac如何实现最简单的随时监测实时运行状态的方法
  • 【Homework】【1--4】Learning resources for DQ Robotics in MATLAB
  • 24/11/5 算法笔记 DBSCAN聚类算法
  • 高中诊断考如何影响高考?答案都在这 5 个方面
  • PySimpleGUI和Pymysql
  • 安全、高效、有序的隧道照明能源管理解决方案
  • uniapp配置消息推送unipush 厂商推送设置配置 FCM 教程
  • 了解云计算工作负载保护的重要性及必要性
  • 东胜物流软件 AttributeAdapter.aspx SQL 注入漏洞复现
  • 前端根据后端返回的文本流逐个展示文本内容
  • Java基础——类和对象的定义链表的创建,输出
  • 通过 ssh config 快速免密连接服务器
  • 【dvwa靶场:XSS系列】XSS (Reflected)低-中-高级别,通关啦
  • 【开发】Java的内存溢出