java操作yaml文件


前言

YAML(YAML Ain't Markup Language),也可以叫做YML,是一種人性化的數據序列化的語言,類似於XML,JSON。SpringBoot的配置文件就支持yaml文件。官網

語法

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進時不允許使用Tab鍵,只允許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
  • #表示注釋,從這個字符一直到行尾,都會被解析器忽略。

yaml有三種數據結構

對象

寫在一行

address: {province: 山東, city: 濟南}

寫在多行

address:
  province: 山東
  city: 濟南

數組

寫在一行

hobbyList: [游泳, 跑步]

寫在多行

hobbyList:
  - 游泳
  - 跑步

純量

  • 字符串 默認不用加引號,包含空格或特殊字符必須加引號,單引號或雙引號都可以
userId: S123
username: "lisi"
password: '123456'
province: 山東
city: "濟南 : ss"
  • 布爾值
success: true
  • 整數
age: 13
  • 浮點數
weight: 75.5
  • Null
gender: ~
  • 時間
    時間使用ISO8601標准 ISO8601
createDate: 2001-12-14T21:59:43.10+05     

使用snakeyaml將yaml文件解析成javabean

添加maven依賴

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

yaml文件,既可以.yaml結尾,也可以.yml結尾,支持兩種方式的擴展名。

userId: 1
username: lisi
password: 123456
address: {province: 山東, city: 濟南}
hobbyList: [游泳, 跑步]

userId: 1
username: "lisi"
password: '123456'
address:
  province: 山東
  city: "濟南 : ss"
hobbyList:
  - 游泳
  - 跑步
import java.io.InputStream;
import java.sql.Timestamp;
import java.util.List;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.yaml.snakeyaml.Yaml;

public class Client {

  public static void main(String[] args) {
    InputStream resource = Client.class.getClassLoader().getResourceAsStream("User.yaml");
    if (Objects.nonNull(resource)) {
      Yaml yaml = new Yaml();
      User user = yaml.loadAs(resource, User.class);
      System.out.println(user.getClass());
      System.out.println(user);
    }
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class User {

    private String userId;
    private String username;
    private String password;
    private Timestamp createDate;
    private Address address;
    private List<String> hobbyList;
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class Address {

    private String province;
    private String city;
  }
}

一鍵轉換,還是很方便的。

使用snakeyaml根據javabean生成yaml文件

import java.util.Arrays;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.yaml.snakeyaml.Yaml;

public class Client {

  public static void main(String[] args) {
    User user = new User();
    user.setUserId("1");
    user.setUsername("lisi");
    user.setPassword("123456");
    user.setAddress(new Address("山東", "濟南"));
    user.setHobbyList(Arrays.asList("游泳", "跑步"));
    Yaml yaml = new Yaml();
    String userString = yaml.dump(user);
    System.out.println(userString);
    System.out.println(yaml.loadAs(userString, User.class));
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class User {

    private String userId;
    private String username;
    private String password;
    private Address address;
    private List<String> hobbyList;
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class Address {

    private String province;
    private String city;
  }
}

輸出結果為

!!com.imooc.sourcecode.java.yaml.test2.Client$User
address: {city: 濟南, province: 山東}
hobbyList: [游泳, 跑步]
password: '123456'
userId: '1'
username: lisi

上面的對象和數組是顯示在一行,我們也可以通過自定義序列化顯示為多行

import java.util.Arrays;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.Yaml;

public class Client {

  public static void main(String[] args) {
    User user = new User();
    user.setUserId("1");
    user.setUsername("lisi");
    user.setPassword("123456");
    user.setAddress(new Address("山東", "濟南"));
    user.setHobbyList(Arrays.asList("游泳", "跑步"));
    //序列化參數
    DumperOptions dumperOptions = new DumperOptions();
    dumperOptions.setDefaultFlowStyle(FlowStyle.BLOCK);
    Yaml yaml = new Yaml(dumperOptions);
    String userString = yaml.dump(user);
    System.out.println(userString);
    System.out.println(yaml.loadAs(userString, User.class));
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class User {

    private String userId;
    private String username;
    private String password;
    private Address address;
    private List<String> hobbyList;
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class Address {

    private String province;
    private String city;
  }
}

輸出結果為

!!com.imooc.sourcecode.java.yaml.test3.Client$User
address:
  city: 濟南
  province: 山東
hobbyList:
- 游泳
- 跑步
password: '123456'
userId: '1'
username: lisi

關於snakeyaml的更多用法,請查看 snakeyaml文檔

使用jackson將yaml文件解析成javabean

添加依賴

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

jackson-dataformat-yaml是在snakeyaml的基礎上又封裝了一層。

import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

public class Client2 {

  public static void main(String[] args) throws IOException {
    InputStream resource = Client.class.getClassLoader().getResourceAsStream("User.yaml");
    if (Objects.nonNull(resource)) {
      YAMLMapper yamlMapper = new YAMLMapper();
      User user = yamlMapper.readValue(resource, User.class);
      System.out.println(user.getClass());
      System.out.println(user);
    }
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class User {

    private String userId;
    private String username;
    private String password;
    private Address address;
    private List<String> hobbyList;
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class Address {

    private String province;
    private String city;
  }
}

使用jackson根據javabean生成yaml文件

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import java.util.Arrays;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

public class Client {

  public static void main(String[] args) throws JsonProcessingException {
    User user = new User();
    user.setUserId("1");
    user.setUsername("lisi");
    user.setPassword("123456");
    user.setAddress(new Address("山東", "濟南"));
    user.setHobbyList(Arrays.asList("游泳", "跑步"));
    YAMLMapper yamlMapper = new YAMLMapper();
    System.out.println(yamlMapper.writeValueAsString(user));
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class User {

    private String userId;
    private String username;
    private String password;
    private Address address;
    private List<String> hobbyList;
  }

  @Setter
  @Getter
  @ToString
  @AllArgsConstructor
  @NoArgsConstructor
  public static class Address {

    private String province;
    private String city;
  }
}

輸出結果為

---
userId: "1"
username: "lisi"
password: "123456"
address:
  province: "山東"
  city: "濟南"
hobbyList:
- "游泳"
- "跑步"

SpringBoot是如何解析yaml文件的


yaml會將字符串解析成對象的格式,spring會將對象扁平化,如

spring:
  application:
    name: test

spring會轉換成spring.application.name=test,和properties文件的格式統一。

參考

YAML 語言教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM