如何使用 Jackson 处理 YAML
上次更新:2026 年 1 月 7 日
1. 简介
在本简短教程中,我们将学习如何使用 Jackson 读取和写入 YAML 文件。
在概述示例结构之后,我们将使用 ObjectMapper 将 YAML 文件读取到 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 从文件读取和写入。我们还查看了一些配置项,这些配置项将帮助我们使数据呈现所需的样子。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















