zoukankan      html  css  js  c++  java
  • YAML语法和用法

    YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。

    YAML的配置文件后缀为 .yml,例如Springboot项目中使用到的配置文件 application.yml 。

     

    数据类型

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

    标量

    标量是最基础的数据类型,不可再分的值,他们一般用于表示单个的变量,有以下七种:

    • 字符串
    • 布尔值
    • 整数
    • 浮点数
    • Null
    • 时间
    • 日期
    # 字符串
    string.value: Hello!
    # 布尔值,true或false
    boolean.value: true
    boolean.value1: false
    # 整数
    int.value: 10
    int.value1: 0b1010_0111_0100_1010_1110 # 二进制
    # 浮点数
    float.value: 3.14159
    float.value1: 314159e-5 # 科学计数法
    # Null,~代表null
    null.value: ~
    # 时间,时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
    datetime.value: !!timestamp 2021-10-20T10:31:00+08:00
    # 日期,日期必须使用ISO 8601格式,即yyyy-MM-dd
    date.value: !!timestamp 2021-04-13

    对象

    单个变量可以用键值对,使用冒号结构表示 key: value,注意冒号后面要加一个空格。可以使用缩进层级的键值对表示一个对象,如下所示:

    person: #对象
      name: 老王
      age: 18
      man: true

    数组

    可以用短横杆加空格 -开头的行组成数组的每一个元素,如下的address字段:

    person: #对象
      name: 老王
      age: 18
      man: true
      address: #数组
        - 深圳
        - 北京
        - 广州

    显示指定类型

    有时我们需要显示指定某些值的类型,可以使用 !(感叹号)显式指定类型。!单叹号通常是自定义类型,!!双叹号是内置类型,例如:

    # 指定为字符串
    string.value: !!str HelloWorld!
    # !!timestamp指定为日期时间类型
    datetime.value: !!timestamp 2021-10-20T02:31:00+08:00

    内置的类型如下:

    • !!int:整数类型
    • !!float:浮点类型
    • !!bool:布尔类型
    • !!str:字符串类型
    • !!binary:二进制类型
    • !!timestamp:日期时间类型
    • !!null:空值
    • !!set:集合类型
    • !!omap,!!pairs:键值列表或对象列表
    • !!seq:序列
    • !!map:散列表类型

     示例

    person: #对象
      name: 老王
      age: 18
      man: true
      address: #数组
        - 深圳
        - 北京
        - 广州
      twoArr: #数组字段的成员也是数组
        - - 1
          - 2
          - 3
        - - 11
          - 12
          - 13
      childs: #数组成员是对象
        - name: 小红
          age: 10
        - name: 小王
          age: 15
      name2: | #文本块
        Hello Java!!
        I am fine!
        Thanks! GoodBye!
      name3: "Hello Java!!
    I am fine!
    Thanks! GoodBye!" #文本块和加双引号的效果一样,双引号能转义特殊字符
    
    
    person2: {name: 老王2, age: 18, man: true, address: [深圳, 北京, 广州],twoArr:[[1,2,3],[11,12,13]],childs: [{name: 小红, age: 10}, {name: 小王, age: 15}]}
    
    #引用会用到 &锚点符合和 星号符号,&用来建立锚点,<< 表示合并到当前数据, 用来引用锚点。
    xiaohong: &xiaohong
      name: 小红
      age: 20
    dept:
      id: D15D8E4F6D68A4E88E
      <<: *xiaohong
    # 上面最终相当于如下:
    xiaohong2:
      name: 小红
      age: 20
    dept2:
      id: D15D8E4F6D68A4E88E
      name: 小红
      age: 20
    #还有一种文件内引用,引用已经定义好的变量,如下:
    base.host: https://www.cnblogs.com/ooo0
    add.person.url: ${base.host}/p/15428552.html

     自定义配置类:

    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.List;
    
    @Configuration
    @ConfigurationProperties(prefix = "person")
    @Getter
    @Setter
    public class PersonYaml {
        private String name;
        private int age;
        private boolean man;
        private List<String> address;
        private List<List<Integer>> twoArr;
        private List<Child> childs;
        private String name2;
        private String name3;
    
        @Getter
        @Setter
        @ToString
        public static class Child {
            private String name;
            private int age;
        }
    }
    @Slf4j
    @Api(tags = "YamlController")
    @RequestMapping("yaml")
    @RestController
    public class YamlController {
    
        @Value("${string.value}")
        private String stringValue;
        @Value("${boolean.value}")
        private boolean booleanValue;
        @Value("${boolean.value1}")
        private boolean booleanValue1;
        @Value("${int.value}")
        private int intValue;
        @Value("${int.value1}")
        private int intValue1;
        @Value("${float.value}")
        private float floatValue;
        @Value("${float.value1}")
        private float floatValue1;
        @Value("${null.value}")
        private String nullValue;
        @Value("${datetime.value}")
        private Date datetimeValue;
        @Value("${date.value}")
        private Date datevalue;
    
        @Autowired
        private PersonYaml personYaml;
        @Autowired
        private Person2Yaml person2Yaml;
    
        @Value("${xiaohong.name}")
        private String xiaohongName;
        @Value("${dept.name}")
        private String deptName;
        @Value("${xiaohong2.name}")
        private String xiaohong2Name;
        @Value("${dept2.name}")
        private String dept2Name;
        @Value("${add.person.url}")
        private String addPersonUrl;
    
    
        @GetMapping("/test")
        public void test(String test) {
            log.info("stringValue:" + stringValue);
            log.info("booleanValue:" + booleanValue);
            log.info("booleanValue1:" + booleanValue1);
            log.info("intValue:" + intValue);
            log.info("intValue1:" + intValue1);
            log.info("floatValue:" + floatValue);
            log.info("floatValue1:" + floatValue1);
            log.info("nullValue:" + nullValue);
            log.info("datetimeValue:" + datetimeValue);
            log.info("datevalue:" + datevalue);
    
            {
                String name = personYaml.getName();
                log.info("name:" + name);
                int age = personYaml.getAge();
                log.info("age:" + age);
                boolean man = personYaml.isMan();
                log.info("man:" + man);
                List<String> address = personYaml.getAddress();
                log.info("address:" + address);
                List<List<Integer>> twoArr = personYaml.getTwoArr();
                log.info("twoArr:" + twoArr);
                List<PersonYaml.Child> childs = personYaml.getChilds();
                log.info("childs:" + childs);
                String name2 = personYaml.getName2();
                log.info("name2:" + name2);
                String name3 = personYaml.getName3();
                log.info("name3:" + name3);
            }
    
            {
                String name = person2Yaml.getName();
                log.info("name:" + name);
                int age = person2Yaml.getAge();
                log.info("age:" + age);
                boolean man = person2Yaml.isMan();
                log.info("man:" + man);
                List<String> address = person2Yaml.getAddress();
                log.info("address:" + address);
                List<List<Integer>> twoArr = person2Yaml.getTwoArr();
                log.info("twoArr:" + twoArr);
                List<Person2Yaml.Child> childs = person2Yaml.getChilds();
                log.info("childs:" + childs);
                String name2 = person2Yaml.getName2();
                log.info("name2:" + name2);
                String name3 = person2Yaml.getName3();
                log.info("name3:" + name3);
            }
    
            log.info("xiaohongName:" + xiaohongName);
            log.info("deptName:" + deptName);
            log.info("xiaohong2Name:" + xiaohong2Name);
            log.info("dept2Name:" + dept2Name);
            log.info("addPersonUrl:" + addPersonUrl);
    
        }
    
    }

    附:

    springboot 读取配置文件

    SpringBoot 获取配置 @Value

    Spring Boot 使用YAML配置

  • 相关阅读:
    用友软件T3出纳通提示单据锁定
    保存单据时提示“计量单位组不正确”
    cxgrid导出数据的格式设置(转载)
    会话打印机不会自动删除解决方法
    用友U8总账对账不平问题总结
    存货核算期初无法从库存取数
    SQL Server 2000 数据库日志太大!如何管理,清除,变小,压缩它
    Delphi控件cxGrid 如何动态创建列?
    关于Treeview 选中节点高亮有关问题
    U8远程接入客户端重新安装问题
  • 原文地址:https://www.cnblogs.com/ooo0/p/15428552.html
Copyright © 2011-2022 走看看