文档章节

YAML简介与使用实例

孟飞阳
 孟飞阳
发布于 2016/07/12 10:03
字数 1091
阅读 786
收藏 16
点赞 0
评论 3

一、YAML介绍

YAML:是YAML Ain't a Markup Language(YAML不是一种置标语言)的递归缩写,早先YAML的意思其实是:Yet Another Markup Language(另外一种置标语言),但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名,YAML的官方定义很简单,即“一种人性化的数据格式定义语言”,其主要功能用途类似于XML或JSON,YAML使用空白字符和分行来分隔数据,且巧妙避开各种封闭符号,如:引号、括号等,以避免这些符号在复杂层次结构中变得难以辨认。YAML的语法与高阶语言类似,可以很简单地表述序列(java中的list)、杂凑表(java中的map)、标量(java中的基本类型等)等数据结构,它重点强调可阅读性。

YAML vs XML对比:

与YAML相似的数据格式定义语言是XML,YAML比XML优越性表现在

> - YAML的可读性好
> - YAML和脚本语言的交互性好
> - YAML使用实现语言的数据类型
> - YAML有一个一致的信息模型
> - YAML易于实现

上面5条是XML不足的地方,同时,YAML也具有XML的下列优点:

> - YAML可以基于流来处理
> - YAML表达能力强,扩展性好

YAML类似于XML的数据描述语言,语法比XML简单很多,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。

二、环境搭建

方式1、maven引入依赖包

	<dependency>
		<groupId>org.yaml</groupId>
		<artifactId>snakeyaml</artifactId>
		<version>1.16</version>
	</dependency>
	<dependency>
		<groupId>com.fasterxml.jackson.dataformat</groupId>
		<artifactId>jackson-dataformat-yaml</artifactId>
		<version>2.7.3</version>
	</dependency>
	<dependency>
		<groupId>org.jyaml</groupId>
		<artifactId>jyaml</artifactId>
		<version>1.3</version>
	</dependency>

方式2:直接引入jar包

在您的工程中引入以下jar即可:

(1)snakeyaml-1.16.jar

(2)Jackson-dataformat-yaml-2.7.3.jar

(3)Jackson-core-2.7.3.jar

(4)jyaml-1.3.jar

三、使用实例

使用的model类:

package la.cewan.model;
/**
 * Person类
 * @author mengfeiyang
 *
 */
public class Person {  
    private String name;  
    private int age;  
    private Person[] children;  
    public Person(){  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public void setChildren(Person[] children) {  
        this.children = children;  
    }  
    public String getName() {  
        return this.name;  
    }  
    public int getAge() {  
        return this.age;  
    }  

    public Person[] getChildren() {  
        return this.children;  
    }  
}  

1、将Java 对象导出为yaml文件

package la.cewan.yaml;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import la.cewan.model.Person;

import org.ho.yaml.Yaml;

/**
 * yaml文件测试,将对象导出为yaml文件
 * @author mengfeiyang
 *
 */
public class TestYaml {  
      
    public static void main(String[] args) {  
          
    	Person father = new Person();
    	father.setAge(12);
    	father.setName("爷爷");
    	
    	Person child1 = new Person();
    	child1.setAge(10);
    	child1.setName("第一个孩子");
    	
    	Person child2 = new Person();
    	child2.setAge(20);
    	child2.setName("第二个孩子");
    	
    	Person child3 = new Person();
    	child3.setAge(13);
    	child3.setName("第一个孙子");
    	
    	child1.setChildren(new Person[]{child3});
    	father.setChildren(new Person[]{child1,child2});
    	
    	List<Person> pList = new ArrayList<Person>();
    	pList.add(father);
    	pList.add(child1);
    	pList.add(child2);
    	pList.add(child3);
    	
    	HashMap<String,Person> pMap = new HashMap<String,Person>();
    	pMap.put("father", father);
    	pMap.put("child1", child1);
    	pMap.put("child2", child2);
    	pMap.put("child3", child3);
    	
        //String fPath = TestYaml.class.getResource("/testYaml.yaml").getFile();   
        File dumpFile = new File("testYaml.yaml");
        try {  
        	Yaml.config.setSuppressWarnings(false);
            Yaml.dump(father, dumpFile);  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  
    }     
}

导出后的yaml文件内容:

--- !la.cewan.model.Person
age: 12
children: !la.cewan.model.Person[]
  - !la.cewan.model.Person
    age: 10
    children: !la.cewan.model.Person[]
      - !la.cewan.model.Person
        age: 13
        name: 第一个孙子
    name: 第一个孩子
  - !la.cewan.model.Person
    age: 20
    name: 第二个孩子
name: 爷爷

2、yaml文件读取

以下实例演示yaml文件中保存的对象映射到实际的java对象类。

package la.cewan.yaml;

import java.io.File;
import java.io.FileNotFoundException;

import org.ho.yaml.Yaml;

import la.cewan.model.Person;

/**
 * 读取yaml文件
 * @author mengfeiyang
 *
 */
public class LoadYamlFile {
	
	public static void main(String[] args) {
		try {  
			File dumpFile = new File("testYaml.yaml");
		    Person corleone = Yaml.loadType(dumpFile, Person.class);  
		    output(corleone);  
		} catch (FileNotFoundException e) {  
		    e.printStackTrace();  
		} 
	}
	
	private static void output(Person person) {  
	    System.out.println("Name: " + person.getName());  
	    System.out.println("Age: " + person.getAge());  
	    System.out.println("Children: " + person.getChildren()[0].getName() + ", " + person.getChildren()[1].getName());  
	    System.out.println("GrandChild:"+person.getChildren()[0].getChildren()[0].getName());
	}  
}

执行后的效果:

3、使用YamlEncoder以流的形式导出yaml文件

package la.cewan.yaml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import la.cewan.model.Person;

import org.ho.yaml.YamlEncoder;

/**
 * 导出yaml文件
 * @author mengfeiyang
 *
 */
public class FileOutStream2Yaml {
	public static void main(String[] args) {
		try {  
			File dumpFile = new File("testYaml.yaml");
		    YamlEncoder yEncoder = new YamlEncoder(new FileOutputStream(dumpFile));  
		    for (int i = 0; i < 3; ++i) { 
		    	Person michael = new Person();
		        michael.setAge(24 + i);  
		        michael.setName("michael"+i);
		        yEncoder.writeObject(michael);  
		        yEncoder.flush();  
		    }  
		} catch (FileNotFoundException e) {  
		    e.printStackTrace();  
		}   
	}
}

导出的testYaml.yaml文件内容为:

--- !la.cewan.model.Person
age: 24
name: michael0
--- !la.cewan.model.Person
age: 25
name: michael1
--- !la.cewan.model.Person
age: 26
name: michael2

4、使用YamlDecoder以流的形式读取Yaml文件

package la.cewan.yaml;

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.ho.yaml.YamlDecoder;

import la.cewan.model.Person;

/**
 * 读取yaml文件
 * @author mengfeiyang
 *
 */
public class YamlFileInStream {
	public static void main(String[] args) {
		try {  
			File dumpFile = new File("testYaml.yaml");
		    YamlDecoder yDecoder = new YamlDecoder(new FileInputStream(dumpFile));  
		    Person[] persons = {new Person(), new Person(), new Person()};  
		    for (int i = 0; i < 3; ++i) {  
		        persons[i] = (Person) yDecoder.readObject();  
		        System.out.println();  
		        output(persons[i]);  
		    }  
		} catch (FileNotFoundException e) {  
		    e.printStackTrace();  
		} catch (EOFException e) {  
		    e.printStackTrace();  
		}  
	}
	private static void output(Person person) {  
	    System.out.println("Name: " + person.getName());  
	    System.out.println("Age: " + person.getAge());   
	}
}

执行后的效果:

四、源码

源码地址:https://yunpan.cn/cBMGItygbcqvh  

访问密码: c220

 

© 著作权归作者所有

共有 人打赏支持
孟飞阳
粉丝 202
博文 894
码字总数 531335
作品 5
朝阳
个人站长
加载中

评论(3)

孟飞阳
孟飞阳

引用来自“老牛啊”的评论

感觉还是没有XML直观啊
看自己的使用习惯了 ,反正是多了一个选择
老牛啊
老牛啊
感觉还是没有XML直观啊
ios122
ios122
文件都可以以流的形式操作,一切皆文件
Openstack Murano(kilo)二次开发之添加Volume

欢迎转载,转载请注明出处:http://my.oschina.net/fmnisme 简介 murano是OpenStack的Application Catalog服务,推崇AaaS(Anything-as-a-Service)的概念,通过统一的框架和API实现应用程序快...

葫芦咩 ⋅ 2015/10/24 ⋅ 1

YAML标记语言简介

YAML标记语言简介¶ 默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML render...

wenqi_arthur ⋅ 2015/11/05 ⋅ 0

kubernetes addons efk

一、简介 这个附加组件由Elasticsearch, Fluentd和Kibana组合而成。 通过结合这三个工具,我们获得了一个可扩展的,灵活的,易于使用的日志收集和分析管道。 Elasticsearch是一个搜索引擎,...

再出发Brave ⋅ 2017/12/11 ⋅ 0

信息标记与提取方法(XML、JSON、YAML)

信息标记 实际应用中的原始数据往往是杂乱无章的,为了更加方便组织和存储各种信息,以及为计算机处理、传播消息提供一种统一的方法。必须对信息进行一定的标记,信息标记的特点一般有以下几...

zengxiantao1994 ⋅ 2017/10/17 ⋅ 0

PyYAML中文文档

PyYAML文档 PyYAML现在维护在https://github.com/yaml/pyyaml。此页面仅用于历史目的。 英文文档链接:http://pyyaml.org/wiki/PyYAMLDocumentation 安装 下载源码包PyYAML-3.12.tar.gz并解压...

506554897 ⋅ 2017/11/22 ⋅ 0

树先生168/PatatiumAppUi

#PatatiumAppUi 简介 这是一个AppUi自动化测试框架,由webdriver中文社区创办人土豆(本人技术笔名)所创建,该APP自动化测试框架是用java语言编写的,基于selenium webdriver Appium的开源自动...

树先生168 ⋅ 2016/09/04 ⋅ 0

通过Rancher部署并扩容Kubernetes集群基础篇二

接上一篇通过Rancher部署并扩容Kubernetes集群基础篇一 7. 使用ConfigMap配置redis https://github.com/kubernetes/kubernetes.github.io/blob/master/docs/user-guide/configmap/redis/redi......

自由linux ⋅ 2017/07/12 ⋅ 0

YAML 语言教程

编程免不了要写配置文件,怎么写配置也是一门学问。 YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。 本文介绍 YAML 的语法,以 JS-YAML 的实现为例。你可以去在线 ...

阮一峰 ⋅ 2016/07/04 ⋅ 0

ansible使用及YAML语法介绍

一、简介 1、ansible 简介 ansible官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:自动化部署APP;自动化管理配置项;自动化的持续交...

nmshuishui ⋅ 2014/11/07 ⋅ 0

opencv学习(十四)XML//YAML的读取和写入(同理可用txt,doc替代)//涉及FileStorage()//读写符号//FileNodeIterator()得到节点

xml,yaml介绍 如何使用 步骤一,FileStorage()打开(读/写前的准备,定义) 步骤二,读写操作函数(符号) 步骤三,vector/maps类型输入输出,FileNodeIterator读取字符串的得到节点 步骤四,...

qq_41553038 ⋅ 04/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部