Java使用snakeyaml解析yaml
YAML
Yaml是一种“是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。”类似于XML但比XML更简洁,语法详见
http://www.ruanyifeng.com/blog/2016/07/yaml.html
在JAVA中也有相关的类库可以进行解析YAML
准备工作
这里使用gradle加入依赖
compile 'org.yaml:snakeyaml:1.17'
之后就可以使用了
load
先上代码
@Test
public void load() throws FileNotFoundException{
//初始化Yaml解析器
Yaml yaml = new Yaml();
File f=new File("test.yaml");
//读入文件
Object result= yaml.load(new FileInputStream(f));
System.out.println(result.getClass());
System.out.println( result);
}
----test.yaml---
a: 1
b: 2
----输出---
class java.util.LinkedHashMap
{a=1, b=2}
这里load方法支持String,InputStream,Reader作为输入
loadall
在一个yaml文件中可以存入多组配置并使用loadAll进行读取,多组之间使用三个横杠分开
@Test
public void loadall() throws FileNotFoundException {
Yaml yaml = new Yaml();
File f = new File("test.yaml");
Iterable<Object> result = yaml.loadAll(new FileInputStream(f));
for (Object obj : result) {
System.out.println(obj.getClass());
System.out.println(obj);
}
}
----test.yaml---
a: 1
b: 2
---
c: 3
----输出---
class java.util.LinkedHashMap
{a=1, b=2}
class java.util.LinkedHashMap
{c=3}
这里返回的是一个Iterable,每个对象的解析是在遍历到的时候进行的是懒加载的
java对象
snakeyaml还支持普通java类型的读取
@Test
public void loadPojo() throws FileNotFoundException {
Yaml yaml = new Yaml();
File f = new File("test.yaml");
Map result= (Map) yaml.load(new FileInputStream(f));
System.out.println(result);
System.out.println(result.get("pojo"));
System.out.println(result.get("pojo2"));
}
public class Pojo {
public String name;
public Pojo(String name){
this.name=name
}
@Override
public String toString(){
return "name->"+name;
}
}
----test.yaml---
pojo: !!yaml.Pojo {name: name}
pojo2: !!yaml.Pojo [ name]
这里简单定义了一个pojo然后在配置文件中有两种方式第一种(使用大括号{})是通过变量名进行赋值,第二种(使用方括号[])是通过构造方法进行赋值
dump
同时还支持将对象反向编译成yaml配置
@Test
public void dump() throws FileNotFoundException {
Yaml yaml = new Yaml();
Pojo p=new Pojo();
p.name="name";
System.out.println( yaml.dump(p));
}
----输出---
!!yaml.Pojo {name: name}
Yaml配置
上面使用的都是YAML的无参构造方法,其实YAML在构造方法中还有可以配置参数
主要有如下4个
constructor
用于配置构造对象的创建过程
representer
用于配置yaml文件中对应tag响应解析成的对象
Representer representer = new Representer();
representer.addClassTag(Car.class, new Tag("!car"));//这里!car就会使用Car类型来解析,而不需要再配置文件中写全car的包名
representer.addClassTag(Wheel.class, Tag.MAP);//会使用Wheel对map的类型进行解析
dumpoption
这个是在dump时,控制输出的宽度,对齐,类类型等相关信息
resolver
用于隐式识别对应类型,只要符合了对应的pattern就会使用对应的tag进行解析
yaml.addImplicitResolver(new Tag("!dice"), Pattern.compile("\d+d\d+"), "123456789");
alias merge
yaml支持别名引用(&用于起别名 *用于引用),以及merger(<<:)
- &anchor
boolean: true
integer: 3
- <<: *anchor
integer: 7
----输出---
[{boolean=true, integer=3}, {integer=7, boolean=true}]
可以看到第二个map自动merge了应用的boolean而integer覆盖了原来的值3
备注
参考官方文档:https://bitbucket.org/asomov/snakeyaml/wiki/Documentation
Java使用snakeyaml解析yaml的更多相关文章
- JAVA使用SnakeYAML解析与序列化YAML
1.概述 本文,我们将学习如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档. 2.项目设置 要在项目中使用SnakeYAML,需要添加Maven ...
- Java解析YAML和Android解析YAML
一.Java解析YAML 1. API的选择 一般分两种:Jyaml和snakeYAML.(Jyaml下载地址:http://download.csdn.net/detail/dgssfgfs/847 ...
- java jar包解析:打包文件,引入文件
java jar包解析:打包文件,引入文件 cmd下: jar命令:package包打包 javac命令:普通类文件打包 Hello.java: package org.lxh.demo; publi ...
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- Java注解全面解析(转)
1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- Java XML Dom解析工具
Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
随机推荐
- 怎样防止重复发送 Ajax 请求?
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:长天之云链接:http://www.zhihu.com/question/19805411/answer/15465427来源 ...
- [转]了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密_Mr_Indigo的空间
了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密 关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修 ...
- Pure.css网格系统学习心得——图片的响应式以及应用填充和边框网格单位的学习
今天学习了pure.css可定制的网格系统,pure默认的网格系统是移动先行,如果我们想在小屏幕上有网格只要用pure-u-*就可以了,下面来说一下它的主要用法! <div class=&quo ...
- <<UML大战需求分析>>阅读笔记(2)
<<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...
- Red Hat Enterprise Server 5.8+oracle10g(中文界面)安装
Red Hat Enterprise Server 5.8+oracle10g(中文界面)安装 VMware workstation10(虚拟机)下面安装红帽企业版5.8 创建虚拟机 新建虚拟机,选择 ...
- pundit
gem "pundit" Include Pundit in your application controller: class ApplicationController &l ...
- js获取select标签选中的值
<p> 城市: <select id="Select1" name="D1"> &l ...
- Hyper-V初涉_Hyper-V虚拟机文件交换
使用虚拟机时,文件交互就显得十分重要.如果能实现物理机与虚拟机之间的文件交互,将会节省大量的时间.比较可惜的是,Hyper-V虚拟机并不支持USB存储设备,所以在文件交换上略显麻烦. 与Hyper-V ...
- Hbase随笔
大数据时代的数据量是超大规模的,传统的关系数据库已经很难存储和管理这些数据了,为了存储海量数据,我们有了HDFS,它可以把成千上万台服务器上的硬盘聚集成一块超级大的硬盘,为了让这些数据产生价值,我们有 ...
- SHELL实现同时操作多个服务器:服务器批量管理
引言: 1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少. 2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办? 3.如果你想让你所管理的几万台 ...