在Java中使用YAML:SnakeYAML和Jackson库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在Java中使用YAML:库概览与使用示例



YAML(YAML Ain't Markup Language)是一种数据序列化格式,由于其可读性高,常用于配置文件。在Java中,处理YAML主要使用两个库:SnakeYAML(轻量、快速)和Jackson YAML(功能强大,支持注解)。本文将详细介绍这两个库,并展示读取、写入和对象序列化的示例。



1. SnakeYAML库



SnakeYAML是Java中最流行的YAML处理库。它支持YAML 1.1的完整语法,包括标签、锚点和自定义类型。主要功能:

  • 将YAML读取为Map、List或自定义Java对象
  • 将Java对象写入YAML
  • 支持递归结构
  • 低内存消耗


引入SnakeYAML(Maven)

<dependency>    <groupId>org.yaml</groupId>    <artifactId>snakeyaml</artifactId>    <version>2.2</version></dependency>


读取YAML文件

考虑以下YAML文件config.yaml示例:

server:  host: localhost  port: 8080database:  url: jdbc:mysql://localhost:3306/mydb  user: admin  password: secret


读取的Java代码:

import org.yaml.snakeyaml.Yaml;import java.io.InputStream;import java.util.Map;

public class SnakeYamlReader { public static void main(String[] args) { Yaml yaml = new Yaml(); try (InputStream in = SnakeYamlReader.class .getClassLoader() .getResourceAsStream("config.yaml")) { Map<String, Object> data = yaml.load(in); System.out.println("服务器主机: " + ((Map<String, Object>) data.get("server")).get("host")); } catch (Exception e) { e.printStackTrace(); } }}


写入YAML

import org.yaml.snakeyaml.Yaml;import java.util.Map;import java.util.LinkedHashMap;

public class SnakeYamlWriter { public static void main(String[] args) { Map<String, Object> data = new LinkedHashMap<>(); Map<String, Object> server = new LinkedHashMap<>(); server.put("host", "127.0.0.1"); server.put("port", 9090); data.put("server", server);

Yaml yaml = new Yaml(); String output = yaml.dump(data); System.out.println(output); }}


2. Jackson YAML库



Jackson YAML是Jackson的一个模块,增加了对YAML格式的支持。主要优势:

  • 与Jackson注解完全集成(@JsonProperty、@JsonIgnore)
  • 直接操作POJO对象,无需额外的Map
  • 通过流式处理实现高性能
  • 支持YAML 1.1和部分1.2


引入Jackson YAML(Maven)

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


将POJO序列化为YAML

创建一个配置类:

import com.fasterxml.jackson.annotation.JsonProperty;

public class AppConfig { @JsonProperty("server") private ServerConfig server; @JsonProperty("database") private DatabaseConfig database; // getter和setter方法 public ServerConfig getServer() { return server; } public void setServer(ServerConfig server) { this.server = server; } public DatabaseConfig getDatabase() {

推荐