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-yamljackson-datatype-jsr310 依赖
  • 使用 ObjectMapper + YAMLFactory 读取和写入 YAML
  • 配置日期格式、关闭 YAML 开头标记等细节

⚠️ 踩坑提醒:

  • LocalDate 需要 JSR310 模块支持
  • YAML 输出默认包含 ---,如无必要建议关闭

如果你需要在 Spring Boot 或其他框架中集成 YAML 配置或数据处理,Jackson 是一个简单粗暴的选择。