使用 Jackson 處理 YAML

Data,Jackson
Remote
1
09:09 PM · Nov 30 ,2025

1. 簡介

在本簡短教程中,我們將學習如何使用 Jackson 讀取和寫入 YAML 文件。

在回顧我們的示例結構之後,我們將使用 ObjectMapper 將 YAML 文件讀取到 Java 對象,並將 Java 對象寫入文件。

2. 依賴項

讓我們添加 Jackson YAML 數據格式的依賴項:

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

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

我們的 Java 對象使用 LocalDate,因此我們還需要添加 JSR-310 類型的依賴項:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.13.0</version>
</dependency>

再次,我們可以在 Maven Central 上查找其最新版本。

3. 數據和對象結構

在依賴項已解決後,我們將轉向我們的輸入文件和我們將使用的 Java 類。

首先,讓我們查看我們將讀取的文件:

orderNo: A001
date: 2019-04-17
customerName: Customer, Joe
orderLines:
    - item: No. 9 Sprockets
      quantity: 12
      unitPrice: 1.23
    - item: Widget (10mm)
      quantity: 4
      unitPrice: 3.45

然後,讓我們定義 Order 類:

public class Order {
    private String orderNo;
    private LocalDate date;
    private String customerName;
    private List<OrderLine> orderLines;

    // Constructors, Getters, Setters and toString
}

最後,讓我們創建我們的 OrderLine 類:

public class OrderLine {
    private String item;
    private int quantity;
    private BigDecimal unitPrice;

    // Constructors, Getters, Setters and toString
}

4. 閲讀 YAML

我們將使用 Jackson 的 ObjectMapper 來讀取我們的 YAML 文件到 Order 對象中,所以我們現在來設置它:

mapper = new ObjectMapper(new YAMLFactory());

我們需要使用 findAndRegisterModules 方法,以便 Jackson 正確處理我們的 Date:

mapper.findAndRegisterModules();

一旦我們配置好我們的 ObjectMapper我們只需使用 readValue:

Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);

我們會發現我們的 Order 對象是從文件中填充的,包括 OrderLine 列表。

5. 編寫 YAML

我們還將使用 ObjectMapperOrder 寫入文件。但是首先,我們添加一些配置:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

添加這行代碼告訴 Jackson 將我們的日期作為 String 寫入,而不是單獨的數字部分。

默認情況下,我們的文件將以三個短橫線開頭。這對於 YAML 格式來説完全有效,但是 我們可以通過禁用該功能在 YAMLFactory 中關閉它

mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));

有了這些額外的設置,我們就可以創建一個 Order

List<OrderLine> lines = new ArrayList<>();
lines.add(new OrderLine("Copper Wire (200ft)", 1, 
  new BigDecimal(50.67).setScale(2, RoundingMode.HALF_UP)));
lines.add(new OrderLine("Washers (1/4\")", 24, 
  new BigDecimal(.15).setScale(2, RoundingMode.HALF_UP)));
Order order = new Order(
  "B-9910", 
  LocalDate.parse("2019-04-18", DateTimeFormatter.ISO_DATE),
  "Customer, Jane", 
  lines);

我們使用 writeValue 寫入我們的訂單:

mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);

當我們查看 orderOutput.yaml 時,它應該類似於:

orderNo: "B-9910"
date: "2019-04-18"
customerName: "Customer, Jane"
orderLines:
- item: "Copper Wire (200ft)"
  quantity: 1
  unitPrice: 50.67
- item: "Washers (1/4\")"
  quantity: 24
  unitPrice: 0.15

6. 結論

在本快速教程中,我們學習瞭如何使用 Jackson 庫將 YAML 讀寫到和從文件中進行操作。我們還查看了一些有助於我們使數據呈現所需樣式的配置項。

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

發佈 評論

Some HTML is okay.