YAML

Posted 转角90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YAML相关的知识,希望对你有一定的参考价值。

1. YAML

YAML 是专门用来写配置文件的语言,非常简介和强大,远比JSON格式方便

2. 基本规则

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只能使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左对齐即可
  • 井号表示注释,

3. YAML 支持的数据结构

  • 对象:键值对

    name: zzz
    
  • 数组 : 连词线开头的行,构成一个数组

    - apple
    - banana
    - orange
    
  • 纯量: 单个的、不可在分的值

    • 字符串
    • 布尔值
    • 整数
    • 浮点数
    • Null
    • 时间
    • 日期
    name; \'zzz\'
    age: 10
    now: 1990-09-09T22:22:22.10-09:00
    

4. 在线转换

Java 和 YAML:如何解析多个 yaml 文档并将它们合并为单个 YAML 表示?

【中文标题】Java 和 YAML:如何解析多个 yaml 文档并将它们合并为单个 YAML 表示?【英文标题】:Java and YAML: how to parse multiple yaml documents and merge them to a single YAML representation? 【发布时间】:2014-12-08 07:47:01 【问题描述】:

假设我有一个文件,defaults.yaml:

pool:
  idleConnectionTestPeriodSeconds: 30
  idleMaxAgeInMinutes: 60
  partitionCount: 4
  acquireIncrement: 5
  username: dev
  password: dev_password

还有另一个文件,production.yaml:

pool:
  username: prod
  password: prod_password

在运行时,我如何读取这两个文件并将它们合并为一个,以便应用程序“看到”以下内容?

pool:
  idleConnectionTestPeriodSeconds: 30
  idleMaxAgeInMinutes: 60
  partitionCount: 4
  acquireIncrement: 5
  username: prod
  password: prod_password

这可以通过 SnakeYAML 实现吗?还有其他工具吗?

我知道一种选择是将多个文件作为 Maps 读取,然后自己合并它们,将合并呈现为单个临时文件,然后读取它,但这是一个重量级的解决方案。现有工具可以做到这一点吗?

【问题讨论】:

我认为现有的工具不会做任何比你想做的更“重量级”的事情——不过,另一种选择是跳过临时文件,只在内存中合并地图。 【参考方案1】:

您可以使用 Jackson,关键是使用 ObjectMapper.readerForUpdating() 并使用 @JsonMerge 注释字段(否则下一个对象中所有缺少的字段将覆盖旧的):

马文:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.9.9</version>
    </dependency>

代码:

public class TestJackson 
    public static void main(String[] args) throws IOException 
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        MyConfig myConfig = new MyConfig();
        ObjectReader objectReader = mapper.readerForUpdating(myConfig);
        objectReader.readValue(new File("misc/a.yaml"));
        objectReader.readValue(new File("misc/b.yaml"));
        System.out.println(myConfig);
    

    @Data
    public static class MyConfig 
        @JsonMerge
        private Pool pool;
    

    @Data
    public static class Pool 
        private Integer idleConnectionTestPeriodSeconds;
        private Integer idleMaxAgeInMinutes;
        private Integer partitionCount;
        private Integer acquireIncrement;
        private String username;
        private String password;
    

【讨论】:

终于!五年后的答案!!! :) 它仍然受到赞赏 - 答案被授予。谢谢!

以上是关于YAML的主要内容,如果未能解决你的问题,请参考以下文章

yaml文件解析

yaml文件解析

yaml文件解析

yaml文件解析

YAML概述

YAML 未解析的外部符号 (yaml-cpp)