Skip to main content
 首页 » 编程设计

使用Jackson处理yaml文件

2022年07月19日170haluo1

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


本文参考链接:https://blog.csdn.net/neweastsun/article/details/108814943