知識庫 / Java IO RSS 訂閱

將JSON轉換為CSV(Java)

Java IO,JSON
HongKong
5
09:53 PM · Dec 05 ,2025

1. 簡介

在本簡短教程中,我們將學習如何使用 Jackson 將 JSON 轉換為 CSV 以及 CSV 轉換為 JSON。

有其他庫可供選擇,例如 org.json 中的 CDL 類,但我們將重點關注 Jackson 庫。

在查看示例數據結構之後,我們將使用 ObjectMapper 和 CSVMapper 組合,以便在 JSON 和 CSV 之間進行轉換。

2. 依賴項

讓我們添加 Jackson CSV 數據格式化器的依賴項:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-csv</artifactId>
    <version>2.13.0</version>
</dependency>

我們可以在 Maven Central 找到該依賴項的最新版本。

我們還將添加核心 Jackson databind 依賴項:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

再次,我們可以通過 Maven Central 找到該依賴項的最新版本。

3. 數據結構

在將 JSON 文檔重構為 CSV 格式之前,我們需要考慮我們的數據模型如何映射到這兩種格式之間。

因此,首先讓我們考慮不同格式支持的數據:

  • 我們使用 JSON 來表示各種對象結構,包括包含數組和嵌套對象的情況
  • 我們使用 CSV 來表示來自對象列表的數據,每個對象都出現在新的一行中

這意味着如果我們的 JSON 文檔包含對象的數組,我們可以將每個對象重構為 CSV 文件中的一行。例如,讓我們使用包含以下訂單項的 JSON 文檔:

[ {
  "item" : "No. 9 Sprockets",
  "quantity" : 12,
  "unitPrice" : 1.23
}, {
  "item" : "Widget (10mm)",
  "quantity" : 4,
  "unitPrice" : 3.45
} ]

我們將會使用 JSON 文檔中的字段名稱作為列標題,並將其重新格式化為以下 CSV 文件:

item,quantity,unitPrice
"No. 9 Sprockets",12,1.23
"Widget (10mm)",4,3.45

4. 讀取 JSON 和寫入 CSV

首先,我們使用 Jackson 的 <em >ObjectMapper</em> 將我們的示例 JSON 文檔讀取到一個 <em >JsonNode</em> 對象樹中:

JsonNode jsonTree = new ObjectMapper().readTree(new File("src/main/resources/orderLines.json"));

接下來,讓我們創建一個 <em >CsvSchema</em >》。它確定 CSV 文件中的列標題、類型和列的順序。為此,我們創建一個CsvSchema Builder>,並將列標題設置為與 JSON 字段名稱匹配:`

Builder csvSchemaBuilder = CsvSchema.builder();
JsonNode firstObject = jsonTree.elements().next();
firstObject.fieldNames().forEachRemaining(fieldName -> {csvSchemaBuilder.addColumn(fieldName);} );
CsvSchema csvSchema = csvSchemaBuilder.build().withHeader();

然後,我們創建一個CsvMapper,使用CsvSchema,最後,我們將jsonTree寫入到我們的CSV文件中

CsvMapper csvMapper = new CsvMapper();
csvMapper.writerFor(JsonNode.class)
  .with(csvSchema)
  .writeValue(new File("src/main/resources/orderLines.csv"), jsonTree);

當我們運行此示例代碼時,我們的示例 JSON 文檔會被轉換為期望的 CSV 文件。

5. 讀取 CSV 文件並寫入 JSON

現在,我們使用 Jackson 的 CsvMapper 來將我們的 CSV 文件讀取到一個 List 中,該 List 包含 OrderLine 對象。為此,我們首先創建一個 OrderLine 類,該類是一個簡單的 POJO:

public class OrderLine {
    private String item;
    private int quantity;
    private BigDecimal unitPrice;
 
    // Constructors, Getters, Setters and toString
}

我們將會使用 CSV 文件中的列標題來定義我們的 CsvSchema然後我們使用 CsvMapper 將數據從 CSV 文件讀取到 MappingIterator 中,該 MappingIterator 包含 OrderLine 對象:

CsvSchema orderLineSchema = CsvSchema.emptySchema().withHeader();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<OrderLine> orderLines = csvMapper.readerFor(OrderLine.class)
  .with(orderLineSchema)
  .readValues(new File("src/main/resources/orderLines.csv"));

接下來,我們將使用 MappingIterator 獲取一個 OrderLine 對象列表。然後,我們使用 Jackson 的 ObjectMapper 將該列表寫入為 JSON 文檔。

new ObjectMapper()
  .configure(SerializationFeature.INDENT_OUTPUT, true)
  .writeValue(new File("src/main/resources/orderLinesFromCsv.json"), orderLines.readAll());

當我們運行此示例代碼時,我們的示例 CSV 文件會被轉換為預期的 JSON 文檔。

6. 配置 CSV 文件格式

我們將使用 Jackson 的一些註解來調整 CSV 文件格式。我們將將 ‘item’ 列標題更改為 ‘name’,將 ‘quantity’ 列標題更改為 ‘count’,刪除 ‘unitPrice’ 列,並將 ‘count’ 設置為第一列。

因此,我們的預期 CSV 文件如下所示:

count,name
12,"No. 9 Sprockets"
4,"Widget (10mm)"

我們將會創建一個新的抽象類,以定義 CSV 文件所需的格式:

@JsonPropertyOrder({
    "count",
    "name"
})
public abstract class OrderLineForCsv {
    
    @JsonProperty("name")
    private String item; 
    
    @JsonProperty("count")
    private int quantity; 
    
    @JsonIgnore
    private BigDecimal unitPrice;

}

然後,我們使用我們的 OrderLineForCsv 類來創建 CsvSchema

CsvMapper csvMapper = new CsvMapper();
CsvSchema csvSchema = csvMapper
  .schemaFor(OrderLineForCsv.class)
  .withHeader(); 

我們還使用 OrderLineForCsv 作為 Jackson Mixin。 這告訴 Jackson 在處理 OrderLine 對象時,使用我們在 OrderLineForCsv 類中添加的註解。

csvMapper.addMixIn(OrderLine.class, OrderLineForCsv.class); 

最後,我們使用 ObjectMapper 讀取我們的 JSON 文檔,將其轉換為 OrderLine 數組,並使用我們的 csvMapper 將其寫入 CSV 文件:

OrderLine[] orderLines = new ObjectMapper()
    .readValue(new File("src/main/resources/orderLines.json"), OrderLine[].class);
    
csvMapper.writerFor(OrderLine[].class)
    .with(csvSchema)
    .writeValue(new File("src/main/resources/orderLinesReformated.csv"), orderLines);

當我們運行此示例代碼時,我們的示例 JSON 文檔會被轉換為預期的 CSV 文件。

7. 結論

在本快速教程中,我們學習瞭如何使用 Jackson 數據格式庫讀取和寫入 CSV 文件。我們還探討了一些配置選項,以幫助我們獲得所需的數據格式。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.