使用Jackson处理yaml文件

Jackson不仅可以处理json和xml,也可以处理yaml文件,本文带你使用jackson提供的ObjectMapper类读写yaml文件

1. yaml文件及环境准备

1.1 yaml文件规则

我们先了解yaml文件常用的几个规则,非常简单:

规则一:缩进

yaml使用一个固定的缩进风格表示数据层结构关系,需要每个缩进级别由两个空格组成,一定不能使用tab键。

规则二:冒号

yaml:
  mykey: my_value

每个冒号后面一定要有一个空格(以冒号结尾不需要空格)

规则三:短横线
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

my_dictionary:
  - list_value_one
  - list_value_two
  - list_value_three

规则四:分割符

在一个文件中,可同时包含多个文件,需使用分隔符。可用连续三个连字号(—)区分多个文件;

1.2 依赖

为了处理yaml文件,需要加入对应依赖:

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

下面示例中需要使用LocalDate,因此再加入JSR-310数据类型依赖:

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

读者可以访问maven仓库引入最新的依赖。

1.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类和OrderLine类:

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
}

2. 读yaml文件

我们需要使用Jackson的ObjectMapper类加载文件值Order对象,首先定义对象:

mapper = new ObjectMapper(new YAMLFactory());

为了处理Date属性,需要调用 findAndRegisterModules 方法:

mapper.findAndRegisterModules();

现在已经配置好ObjectMapper,使用readValue方法则很简单:

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

好了,我们已经成功加载yaml文件并填充order对象。

3. 写yaml文件

写yaml文件,仍然要使用ObjectMapper 类,但需要增加一些配置:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

这个配置让jackson写日期为字符串,而不是数值。缺省文件以三个横杠开头,但我们可以禁用该特性:

mapper = new ObjectMapper(new YAMLFactory().disable(Feature.WRITE_DOC_START_MARKER));

配置好额外属性后,先创建Order对象:

List<OrderLine> lines = new ArrayList<>();
lines.add(new OrderLine("Copper Wire", 1, new BigDecimal(50.67).setScale(2, RoundingMode.HALF_UP)));
lines.add(new OrderLine("Washer", 24, new BigDecimal(.15).setScale(2, RoundingMode.HALF_UP)));
LocalDate orderDate=LocalDate.parse("2019-04-18", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
Order order = new Order("B-9910", orderDate,"New,Jane", 
  lines);

现在使用writerValue写文件:

mapper.writeValue(new File(**"src/main/resources/orderOutput.yaml"**), order);

成功生成orderOutput.yaml文件。

4. 总结

本文我们介绍了Yaml文件规则,如何使用Jackson对yaml文件进行读写。