Jackson 读写YAML文件

作者 | 2020年4月1日

1. 前言

在本文中我们中我们将学习在Jackson中读写YAML文件。在Jackson中可以使用ObjectMapper类把YAML文件转为Java对象或把Java对象写到YAML文件中。

2. 依赖

为了在Jackson中处理YAML文件,我们需要添加一个依赖到pom.xml文件中:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.9.8</version>
</dependency>

你可以通过Maven Central找到该依赖的最新版本。

此外我们的Java对象中使用了LocalDate类,所以还要添加JSR-310数据类型支持:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.8</version>
</dependency>

3. 数据结构

在处理完包依赖关系之后,我们来看一下本例中使用的数据结构。

首先,来看一下输入的YAML文件。

src/main/resources/orderInput.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

然后是对应的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());

此外,我们在Order中用到了LocalDate类,所以还需要调用findAndRegisterModules方法来自动注册对应的处理模块。

mapper.findAndRegisterModules();

配置完ObjectMapper之后,我们只需要调用readValue方法即可:

Order order = mapper.readValue(new File("src/main/resources/orderInput.yaml"), Order.class);

最终,Order与OrderLine中被来自于orderInput.yaml文件中的数据所填充。

5. 写YAML文件

我们继续来使用ObjectMapper将Order写到YAML文件中,但是,在这之前,我们需要在ObjectMapper上进行一些额外的配置:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

这行代码用于告诉ObjectMapper在序列化时把日期当做字符串类型。

默认情况下,ObjectMapper输出的YAML文件会以---开头,我们需要禁用它:

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);

最后把Order输出为YAML文件:

 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文件,我们主要对ObjectMapper进行一些配置类实现此目的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注