YAML详解

文章目录

  • 介绍
  • 优势
    • YAML与XML
    • YAML与JSON
  • 详解
    • 文件结构
    • 语法
    • 数据结构
    • 数据类型
      • 纯量
      • 对象
      • 数组
  • Java操作
    • 数据准备
    • SnakeYAML(推荐)
      • Maven
      • 示例
    • JYaml
      • Maven
      • 示例
    • YamlBeans
      • Maven
      • 示例

介绍

YAML,YAML Ain’t Markup Language的简称。是一种人性化、跨语言的数据序列化标准,基于Unicode的数据序列化语言,围绕敏捷编程语言的常见本地数据类型而设计。它广泛地用于编程需求,从配置文件到Internet消息传递、对象持久性到数据审计。

优势

YAML与XML

  • 具有 XML 同样的优点,但比 XML 更加简单、敏捷等

YAML与JSON

  • JSON 可以看作是 YAML 的子集,也就是说 JSON 能够做的事情,YAML 也能够做
  • YAML 能表示得比 JSON 更加简单和阅读,例如“字符串不需要引号”。所以 YAML 容易可以写成 JSON 的格式,但并不建议这种做
  • YAML 能够描述比 JSON 更加复杂的结构,例如“关系锚点”可以表示数据引用(如重复数据的引用)。

详解

文件结构

YAML文件可以由单个或多个文档组成(文档之间相互独立)。多个文档之间使用“—”(三个横线)作为文档的开始分隔符。使用“…”(三个点)作为文档的结束分隔符(可省略)。单个文档省略分隔符。

语法

  • 缩进:空格
  • 序列:“-”加空格
  • 映射:“:”加空格
  • 注释:“#”

数据结构

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

数据类型

纯量

  • 整数、浮点、字符串、布尔、Null、时间、日期
# 整数
age: 10
# 浮点
price: 1.48

#  字符串
name: Jane
address: BeiJing

# 布尔
online: true

# Null
car: ~

# 时间(ISO8601 格式)
time: 2019-02-28t21:59:43.10-05:00 

# 日期(iso8601 格式的年、月、日)
date: 2019-02-28

对象

#  对象,即person:{name:Jane, age:20, address:BeiJing}
person: 
    name: Jane
    age: 20
    address: BeiJing

数组

# 数组,即pets:[cat, dog, pig]
pets:
    - cat
    - dog
    - pig

Java操作

数据准备

  • yml定义
planetName: Earth
continents:
  - name: Asia
    countries:
      - China
      - Japan
      - Korea
  - name: Europe
    countries:
      - England
      - France
      - Germany
  - name: North America
    countries:
      - Ameriac
      - Canada
      - Mexico
  - name: South America
    countries:
      - Brazil
      - Argentina
      - Chile
  - name: Oceania
    countries:
      - Australia
      - New Zealand
  - name: Africa
    countries:
      - Egypt
      - zimbabwe
  - name: Antarctica
  • Java对象
@Data
public class Earth {
    private String planetName;
    private List continents;
}

@Data
public class Continent {
    private String name;
    private List countries;
}

SnakeYAML(推荐)

Maven

<dependency>
    <groupId>org.yamlgroupId>
    <artifactId>snakeyamlartifactId>
    <version>1.23version>
dependency>

示例

public class SnakeYaml {

    public static void main(String[] args) {
        // yml文件转Java对象
        Yaml yaml = new Yaml();
        InputStream input = SnakeYaml.class.getResourceAsStream("/earth.yml");
        Earth earth = yaml.loadAs(input, Earth.class);
        System.out.println(JSON.toJSONString(earth));
    }
}

JYaml

Maven

<dependency>
    <groupId>org.jyamlgroupId>
    <artifactId>jyamlartifactId>
    <version>1.3version>
dependency>

示例

public class JYaml {

    public static void main(String[] args) throws FileNotFoundException {
        // yml文件转Java对象
        InputStream input = SnakeYaml.class.getResourceAsStream("/earth.yml");
        Earth earth = Yaml.loadType(input, Earth.class);
        System.out.println(JSON.toJSONString(earth));
    }
}

YamlBeans

Maven

<dependency>
    <groupId>com.esotericsoftware.yamlbeansgroupId>
    <artifactId>yamlbeansartifactId>
    <version>1.13version>
dependency>

示例

public class YamlBeans {

    public static void main(String[] args) throws Exception {
        // yml文件转Java对象
        FileReader fileReader = new FileReader(new File(YamlBeans.class.getResource("/earth.yml").getPath()));
        YamlReader reader = new YamlReader(fileReader);
        Earth earth = reader.read(Earth.class);
        System.out.println(JSON.toJSONString(earth));

        // Java对象转yml文件
        YamlWriter writer = new YamlWriter(new FileWriter("/Users/liuxiangxiang/Desktop/output.yml"));
        writer.write(earth);
        writer.close();
    }
}

你可能感兴趣的:(Yml)