如何不使用第三方库将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
相关产品推荐
相关产品推荐

