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
我們還將使用 ObjectMapper 將 Order 寫入文件。但是首先,我們添加一些配置:
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 讀寫到和從文件中進行操作。我們還查看了一些有助於我們使數據呈現所需樣式的配置項。