1. 简介
本文介绍如何使用 Jackson 读取和写入 YAML 文件。
我们会先定义一个简单的 YAML 文件结构和对应的 Java 类,然后通过 Jackson 的 ObjectMapper 将 YAML 文件反序列化为 Java 对象,以及将 Java 对象序列化为 YAML 文件。
2. 依赖配置
首先,需要在项目中引入 Jackson 的 YAML 支持模块:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.13.0</version>
</dependency>
如果你的 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. 数据与对象结构
我们先来看一下 YAML 文件的结构:
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
对应的 Java 类如下:
✅ 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 文件。
✅ 初始化 ObjectMapper
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
mapper.findAndRegisterModules(); // 自动注册 JSR310 等模块
✅ 读取文件
Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);
这样就能将 YAML 文件内容完整地映射到 Order
对象中,包括嵌套的 orderLines
列表。
5. 写入 YAML 文件
写入 YAML 的流程与读取类似,但需要一些额外配置以确保输出格式更友好。
✅ 配置 ObjectMapper
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));
⚠️ 注意:
WRITE_DOC_START_MARKER
会控制是否在 YAML 文件开头输出---
,通常可以关闭。
✅ 构建测试数据
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);
✅ 写入文件
mapper.writeValue(new File("src/main/resources/orderOutput.yaml"), order);
输出结果如下:
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 文件:
- 引入
jackson-dataformat-yaml
和jackson-datatype-jsr310
依赖 - 使用
ObjectMapper
+YAMLFactory
读取和写入 YAML - 配置日期格式、关闭 YAML 开头标记等细节
⚠️ 踩坑提醒:
LocalDate
需要 JSR310 模块支持- YAML 输出默认包含
---
,如无必要建议关闭
如果你需要在 Spring Boot 或其他框架中集成 YAML 配置或数据处理,Jackson 是一个简单粗暴的选择。