You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用第三方库将JsonArray按正确格式转换为CSV文件

问题原因

当前代码直接将JsonObject整体序列化为JSON字符串后写入文件,没有按照CSV格式要求拆分字段、写入表头,且文件写入流放在循环内部会反复覆盖文件内容,最终输出的是整段JSON文本,不符合标准CSV格式。

修复方案

标准CSV格式要求:第一行写入逗号分隔的表头字段,后续每行写入对应顺序的字段值,特殊字符做CSV标准转义。修复时注意:

  • 将文件写入流初始化移到循环外,避免循环过程中反复覆盖文件内容
  • 无需用JsonWriter序列化整个对象,直接从JsonObject中按表头字段顺序取值即可
  • 推荐使用try-with-resources语法自动释放IO资源,避免资源泄漏

修复后完整代码如下:

import javax.json.JsonArray;
import javax.json.JsonObject;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class JsonToCsvUtil {
    // 按期望顺序定义CSV表头
    private static final String[] CSV_HEADERS = {"name", "value", "date"};
    // 替换为你实际的目录和文件名变量
    private static String diretory = "/your/target/path/";
    private static String name = "output";

    public static void writeFilteredJsonToNewFile(JsonArray jsonArray) {
        String csvFullPath = diretory + name + ".csv";
        // 自动管理IO资源关闭
        try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(csvFullPath))) {
            // 写入表头行
            bufferedWriter.write(String.join(",", CSV_HEADERS));
            bufferedWriter.newLine();

            // 遍历所有JSON对象逐行写入数据
            for (JsonObject obj : jsonArray.getValuesAs(JsonObject.class)) {
                List<String> rowFields = new ArrayList<>();
                for (String field : CSV_HEADERS) {
                    if (obj.isNull(field)) {
                        rowFields.add("");
                        continue;
                    }
                    // 按字段类型取值,做CSV标准转义
                    switch (obj.get(field).getValueType()) {
                        case STRING:
                            String strVal = obj.getString(field);
                            // 字符串包含逗号、双引号、换行时,用双引号包裹,内部双引号转义为两个双引号
                            if (strVal.contains(",") || strVal.contains("\"") || strVal.contains("\n")) {
                                strVal = "\"" + strVal.replace("\"", "\"\"") + "\"";
                            }
                            rowFields.add(strVal);
                            break;
                        case NUMBER:
                            // 数值类型直接转字符串,可根据需求选择longValue()/bigDecimalValue()等
                            rowFields.add(String.valueOf(obj.getJsonNumber(field).longValue()));
                            break;
                        default:
                            rowFields.add(obj.get(field).toString());
                    }
                }
                // 拼接当前行写入
                bufferedWriter.write(String.join(",", rowFields));
                bufferedWriter.newLine();
            }
            System.out.println("Created new File!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
输出结果

运行后生成的CSV文件内容为标准格式,用表格工具打开可直接识别:

name,value,date
aondx,10,1999-01-09T14:30:53Z

如果需要value值为40,替换源JSON中对应value的数值即可,代码会自动适配读取。

内容的提问来源于stack exchange,提问作者iTchTheRightSpot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:21:23