使用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文件进行读写。