简介

YAML 是一种简洁的非标记语言(YAML Ain’t Markup Language),YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读, 常用于作为配置文件, 比json更加简洁。

YAML 1.2 (3rd Edition): http://yaml.org/spec/1.2/spec.html
js-yaml: https://github.com/nodeca/js-yaml
YAML转化JSON: http://nodeca.github.io/js-yaml/

YAML 的设计目标:

  • 人类容易阅读
  • 可用于不同程序间的数据交换
  • 适合描述程序所使用的数据结构,特别是脚本语言
  • 丰富的表达能力与可扩展性
  • 易于使用

YAML与XML、JSON比较

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

  • YAML 与 JSON

  • JSON 可以看作是 YAML 的子集,也就是说 JSON 能够做的事情,YAML 也能够做

  • YAML 能表示得比 JSON 更加简单和阅读,例如“字符串不需要引号”。所以 YAML 容易可以写成 JSON 的格式,但并不建议这种做

  • YAML 能够描述比 JSON 更加复杂的结构,例如“关系锚点”可以表示数据引用(如重复数据的引用)

YAML的适用范围

  • 由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.
  • YAML比较适合做序列化。因为它是宿主语言数据类型直转的,由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.
  • YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.

语法:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 禁止使用tab缩进,只能使用空格键 , 建议使用两个空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • #表示注释,从这个字符一直到行尾,都会被解析器忽略。
  • 字符串可以不用引号,也可以使用单引号或者双引号

数据结构

  • 对象(键值表): 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)冒号分隔键值对(Key: Value), Key需要顶格写,前面不能有空格,冒号后面需要有一个空格然后再跟值, 相同的缩进属于同一个map 例如age: 12
  • 数组(列表): 一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量scalar: 数据最小的单位,不可以再分割。
    对象和数组可以任意嵌套组合成负责的数据结构。

数据类型: 支持字符串、整数、浮点数、布尔、日期、null、对象、数组

示例

在一个文件中,可同时包含多个文件,并用—分隔。选择性的符号”…”可以用来表示文件结尾(在利用流的通信中,这非常有用,可以在不关闭流的情况下,发送结束信号)

---# 使用冒号:表示键值对, 冒号后面需要有一个空格, key需要顶格写,前面不能有空格 同一缩进的所有键值对属于一个mapstr: 这是一行字符串   # 字符串默认不使用引号表示
str2: '内容: 字符串' # 如果字符串之中包含空格或特殊字符,需要放在引号之中
str3: '内容\n字符串'  # 单引号和双引号都可以使用,双引号不会对特殊字符转义
str4: "内容\n字符串"  # 双引号对特殊字符不转义
str5: 'labor''s day' # 单引号之中如果还有单引号,需要使用单引号转义
# 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str6: 这是一段  多行字符串
str7: | # "|"表示每行末尾都跟一个换行符FooBar
str8: > # “>” 最后一行跟一个换行符FooBar
str9: |Foo
str10: |+ # +表示保留文字块末尾的换行Foostr11: |- # -表示删除字符串末尾的换行Foostr12: | # 字符串之中可以插入 HTML 标记<p style="color: red">段落</p>int: 10
float: 9.99
bool: true  # true、false
# 时间采用 ISO8601 格式 1点被转成9点
date: 2015-08-23   # 日期
datetime: 2015-08-23T02:02:00.1z  # 日期时间
iso8601: 2015-08-23t21:59:43.10-05:00  # iso8601 日期格式
spaced: 2015-08-23 21:59:43.10 -5      ## 对象:缩进方式
obj: field1: xfield2:field21: xxfield22: xxx# 对象:行内方式(和json格式差不多)
obj2: { field1: 'x', field2: { field21: 'xx', field22: 'xxx' } }# 数组:连字符方式,如果元素也是数组就再使用一层缩进
array:- ele1- ele2-- ele31- ele32# 行内方式
array2: [ 'ele1', 'ele2', [ 'ele31', 'ele32' ] ]# 数组中的原始是对象
array3:- field1: xfield2: xxfield3: xxx- field1: xfield2: xxfield3: xxxset: ? ele? ele2# 嵌套方式
nested:field1: xarr:- {field1: x, field2: x, field3: [1, 2, 3]}- {field1: x, field2: x, field3: [2, 3, 4]}arr2:-- a- b- - c- c# 类型转换: 使用两个感叹号跟要转换的基本数据类型,单引号:用于转换自定义对象
#下面是内置类型
#!!int               # 整数类型
#!!float             # 浮点类型
#!!bool              # 布尔类型
#!!str               # 字符串类型
#!!binary            # 也是字符串类型
#!!timestamp         # 日期时间类型
#!!null              # 空值
#!!set               # 集合
#!!omap, !!pairs     # 键值列表或对象列表
#!!seq               # 序列,也是列表
#!!map               # 键值表
test: !!str 123# 当键是数组或者对象时需要使用问号来标记
?[blue, reg, green]: xxx
?{a:xx, b:xx}: xx# 锚点和引用
ref:- &index1 a- b- *index1
...

yaml转成json的结果对比

{ str: '这是一行字符串',str2: '内容: 字符串',str3: '内容\\n字符串',str4: '内容\n字符串',str5: 'labor\'s day',str6: '这是一段 多行 字符串',str7: 'Foo\nBar\n',str8: 'Foo Bar\n',str9: 'Foo\n',str10: 'Foo\n\n',str11: 'Foo',str12: '<p style="color: red">\n   段落\n</p>\n',int: 10,float: 9.99,bool: true,date: Sun Aug 23 2015 08:00:00 GMT+0800 (CST),datetime: '2015-08-23T02:02:00.1z',iso8601: Mon Aug 24 2015 10:59:43 GMT+0800 (CST),spaced: Mon Aug 24 2015 10:59:43 GMT+0800 (CST),obj: { field1: 'x', field2: { field21: 'xx', field22: 'xxx' } },obj2: { field1: 'x', field2: { field21: 'xx', field22: 'xxx' } },array: [ 'ele1', 'ele2', [ 'ele31', 'ele32' ] ],array2: [ 'ele1', 'ele2', [ 'ele31', 'ele32' ] ],array3: [ { field1: 'x', field2: 'xx', field3: 'xxx' },{ field1: 'x', field2: 'xx', field3: 'xxx' } ],set: { ele: null, ele2: null },nested: { field1: 'x',arr: [ { field1: 'x', field2: 'x', field3: [ 1, 2, 3 ] },{ field1: 'x', field2: 'x', field3: [ 2, 3, 4 ] } ],arr2: [ [ 'a', 'b' ], [ 'c', 'c' ] ] },test: '123','?[blue, reg, green]': 'xxx','?{a:xx, b:xx}': 'xx',ref: [ 'a', 'b', 'a' ] }

Java解析

引入依赖

<!-- https://mvnrepository.com/artifact/org.yaml/snakeyaml -->
<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.20</version>
</dependency>

准备实体:

public class Address {private Long id;private String address;
}public class UserInfo {private Long userId;private String username;
}public class User {private Long id;private String name;private Integer age;private Date birthday;private float height;private double score;private boolean isVip;private String[] hobbies;private List<Address> addresses;private UserInfo userInfo;
}

测试

public static void main(String[] args) throws Exception {UserInfo userInfo = new UserInfo(1L, "xiaoming");Address address = new Address(1L, "上海市浦东新区");Address address2 = new Address(2L, "北京市朝阳区");List<Address> addresses = new ArrayList<Address>();addresses.add(address);addresses.add(address2);User user = new User(1L, "小明", 20, new Date(), 178.88f, 99999.99,true, new String[]{"eat", "drink", "play", "happy"}, addresses, userInfo);Yaml yaml = new Yaml();// 写入文件yaml.dump(user, new FileWriter("/Users/mengday/Desktop/user.yml"));// 从文件中读User user1 = yaml.loadAs(new FileInputStream(new File("/Users/mengday/Desktop/user.yml")), User.class);System.out.println(user1.toString());
}

结果:

!!com.example.demo.User
addresses:
- {address: 上海市浦东新区, id: 1}
- {address: 北京市朝阳区, id: 2}
age: 20
birthday: 2018-03-13T09:30:38.586Z
height: 178.88
hobbies: [eat, drink, play, happy]
id: 1
name: 小明
score: 99999.99
userInfo: {userId: 1, username: xiaoming}
vip: true

User{id=1, name=’小明’, age=20, birthday=Tue Mar 13 17:30:38 CST 2018, height=178.88, score=99999.99, isVip=true, hobbies=[eat, drink, play, happy], addresses=[Address{id=1, address=’上海市浦东新区’}, Address{id=2, address=’北京市朝阳区’}], userInfo=UserInfo{userId=1, username=’xiaoming’}}

原文链接:https://blog.csdn.net/vbirdbest/article/details/79541807

Spring Boot入门教程(零): yaml使用详解相关推荐

  1. Spring Boot的Properties和YAML配置文件详解:

    一.配置文件的生效顺序,会对值进行覆盖: 1. @TestPropertySource 注解 2. 命令行参数 3. Java系统属性(System.getProperties()) 4. 操作系统环 ...

  2. Spring Boot系列教程四:配置文件详解properties

    一.配置随机数,使用随机数 在application.properties文件添加配置信息 [html] view plaincopy #32位随机数 woniu.secret=${random.va ...

  3. Spring Boot入门教程(四十):微信支付集成-刷卡支付

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 一:准备工作 使用微信支付需要先开通服务号,然后还要开通微信支付,最后还要配置一些开发参数,过程比较多. 申请服务号(企业 ...

  4. Spring Boot入门教程(四十一):微信支付集成-扫码支付

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 一:准备工作 使用微信支付需要先开通服务号,然后还要开通微信支付,最后还要配置一些开发参数,过程比较多. 申请服务号(企业 ...

  5. Spring Boot 使用 HikariCP 连接池配置详解

    Spring Boot 使用 HikariCP 连接池配置详解 HikariCP 是一个高性能的 JDBC 连接池组件. Spring Boot 2.x 将其作为默认的连接池组件,项目中添加 spri ...

  6. springboot 创建地址_这可能是史上最易懂的 Spring Boot 入门教程

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  7. Spring Boot 入门教程 | 图文讲解

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  8. SpringBoot2.x系列教程(七十)Spring Boot Actuator集成及自定义Endpoint详解

    前言 曾经看到Spring Boot Actuator这个框架时,一直在想,它到底有什么作用呢?虽然知道它提供了很多端点,有助于应用程序的监控和管理,但如果没有直接的实践案例,还是很难有说服力的. 直 ...

  9. Spring Boot入门教程(二十八): 校验(validation)

    validation主要是校验用户提交的数据的合法性,比如是否为空,密码是否符合规则,邮箱格式是否正确等等,校验框架比较多,用的比较多的是hibernate-validator, 也支持国际化,也可以 ...

  10. spring boot rabbitmq_Spring Boot2(十):RabbitMQ 详解

    关于SpringBoot整合RabbitMQ,我看了微笑哥的博文,实在不知道还有比这更加全面的了.于是我转载过来了.. RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起 ...

最新文章

  1. linux--vi 和vim 的区别
  2. 聊聊reactive streams的schedulers
  3. codevs 4560 NOIP2015 D2T2 子串
  4. modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错
  5. office word 开发
  6. html5 本地存储Web Storage
  7. SpringBoot另一大神器-Actuator
  8. java上传音频到服务器_Java 客户端向服务端上传mp3文件数据的实例代码
  9. 前端学习(1716):前端系列javascript之页面配置下
  10. argv、lambda、filter、map、reduce
  11. 关于Int自增字段和GUID字段的性能测试。只有测试,没有分析,呵呵
  12. 代码高亮插件——wangHightLighter.js——demo演示
  13. 21秋期末考试成本会计10168k2
  14. 单变量分析、组合变量分析
  15. chromium浏览器_什么是Chrome? Chromium网络浏览器与Chrome有何不同
  16. 用C语言将四个数字排列顺序(不重复)
  17. 遗传算法的C语言实现(一):以非线性函数求极值为例
  18. Android 12.0 第三方无源码apk授予QUERY_ALL_PACKAGES等其他权限的方法
  19. 3.23-Numpy
  20. MacOS上双开微信

热门文章

  1. php 后台数据 u,Yunucms代码审计:后台XSS和数据库信息泄露
  2. 软件项目管理/ IT项目管理 总复习
  3. C#员工考勤管理系统源码 考勤工资管理系统源码
  4. Navision的ERP系统 - 微软Dynamics NAV的ERP软件评论
  5. 基于MATLAB的声纹识别系统软件的设计
  6. java docx4j 目录,docx4j项目(包括jar包、javadoc文档、源码及示例)
  7. 气溶胶反演输入转化错误_暗目标法的Himawari-8静止卫星数据气溶胶反演
  8. adams做动态静力学分析(牛头刨床为例)机械原理课设(完整)
  9. 《遥感原理与应用》第三版——思维导图
  10. 【Vue使用高德API制作热力图】