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 將 訂單 寫入文件。但是首先,讓我們為其添加一些配置:
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);添加那一行會告訴 Jackson 將我們的日期以 String 格式寫入,而不是單獨的數字部分。
默認情況下,我們的文件將以三個連字符開頭。這對於 YAML 格式來説完全有效,但 我們可以通過在 YAMLFactory 中禁用該功能來關閉它。
mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));有了這些額外配置就緒,我們現在來創建一個 訂單:
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);讓我們使用 <em valueWrite 來編寫我們的訂單:
mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);當我們查看 <em 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.156. 結論
在本快速教程中,我們學習瞭如何使用 Jackson 庫將 YAML 讀寫到和從文件中。我們還探討了一些配置項,以幫助我們使數據呈現出我們想要的方式。