日暮途远

日暮途远,涸辙难行;东隅已逝,桑榆非晚

新的数据交换格式:YAML

YAML的来源

yaml全称是Ain’t a Markup Language,意思是它不是一种标记语言。但是,实际上它又确确实实是一种标记语言,如何理解呢?
在yaml开发早起,参考了很多其他语言,如XML,SDL及电子邮件格式,将自己定义为Yet Another Markup Language。yaml为了强调自己与其他语言的不同,突出自身是以数据为重点的语言,而不像其他语言一样以标记为重点。正是这个重要的特点,使得yaml在许多系统设计过程中可以取代xml,成为一种可读性高,易于表达数据序列的编程语言。

YAML实例

日常生活中,有许多都是以yaml来展现的,如购物发票、银行收据等等。
下面我们看一个yaml的文件,通过实例来体会一下:

以上的yaml文件,通过换行、缩进、空白符号等简洁地表示出了一个结构型数据。
我们可以直观地看到是关于公司的一些数据。其中根节点为三家公司名称:阿里、网易、腾讯,其中清晰表达了公司的一些子信息,如网站地址、ceo、所在城市等。

YAML列表被表示成使用[index]间接引用作为属性keys的形式,例如下面的YAML:

将会转化到下面的属性中:

我们的java程序如何来跟它交互,看下面的代码。

运行结果:

SpringBoot 框架提供两个便利的类用于加载YAML文档,YamlPropertiesFactoryBean会将YAML作为Properties来加载,YamlMapFactoryBean会将YAML作为Map来加载。

使用Spring DataBinder工具绑定那样的属性(这是@ConfigurationProperties做的事),你需要确定目标bean中有个java.util.List或Set类型的属性,并且需要提供一个setter或使用可变的值初始化它,比如,下面的代码将绑定上面的属性:

YamlPropertySourceLoader类能够用于将YAML作为一个PropertySource导出到Sprig Environment。这允许你使用熟悉的@Value注解和占位符语法访问YAML属性。

你可以在单个文件中定义多个特定配置(profile-specific)的YAML文档,并通过一个spring.profiles key标示应用的文档。例如:

在上面的例子中,如果development配置被激活,那server.address属性将是127.0.0.1。如果development和production配置(profiles)没有启用,则该属性的值将是192.168.1.100。

但是:YAML文件不能通过@PropertySource注解加载。所以,在这种情况下,如果需要使用@PropertySource注解的方式加载值,那就要使用properties文件。

分析总结

通过jyaml的提供的类库,我们可以方便地解析yaml格式文件,将它转化为一个HashMap对象,通过kv形式获取其中的对象及其属性。
通过例子可以发现,yaml非常平易近人,它的优点,总结下来有:
1、语法简洁,易于人类阅读。
2、适合表示数据结构,具有丰富的表达能力和扩展性。
3、可用于不同程序间交换数据,易于使用。

与其他语言比较

最后,来看一下yaml与一些语言的比较:
json:
json的语法是yaml1.2版的子集,json的语法结构和yaml的内置格式相同,所以大部分json文件都可以被yaml剖析。虽然可以用yaml做大范围的类似json格式的分层,不过yaml标准不建议这样使用。主要的考量点是,这样做是否让文件可读性增加,易于人们阅读理解。
xml:
xml的标签概念在yaml中是找不到的。对于数据结构序列,标签属性的特色就是将资料及其复杂附加信息进行分离,并将各种原生数据结构用同一种语言表示。在yaml本身的规范中,没有类似xml的语言定义文件纲要(用来验证自身的结构正确性)。但是存在yaml纲要描述语言和yaxml(用xml描述yaml的结构)。

点赞
  1. 逗逼哈士其说道:

    接触 springboot 才关注这个格式,跟 JSON 有点像,不过嵌套写法确实简洁许多啊

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">