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 知识点进行复习和学习一番,大 ...
随机推荐
- JSP内置对象有哪些呢?
内置对象 request request 对象是 javax.servlet.httpServletRequest类型的对象. 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的 ...
- Android照片墙加强版,使用ViewPager实现画廊效果
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12646775 记得关于照片墙的文章我已经写过好几篇了,有最基本的照片墙,有瀑布流模 ...
- How to Use Lucene.NET with Windows Azure SQL Database
http://social.technet.microsoft.com/wiki/contents/articles/2367.how-to-use-lucene-net-with-windows-a ...
- 我与solr(四)--solrJ
SolrJ索引库: solr提供的一个客户端操作框架,在文件/solr6.2/dist下面可以找到该jar包solrj.jar以及相关jar包,可以使用maven添加. java使用solrJ如下: ...
- 【细说Java】关于main方法的一些细节
Public static void main(String[] args) public :main方法是jvm运行的入口,所以必须是public来供外部调用 static :main方法无需生成对 ...
- OpenMP之枚举排序
// EnumSort.cpp : 定义控制台应用程序的入口点. //枚举排序 /* 枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort). 该算 ...
- ABP框架详解(五)Navigation
ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是.所以为方便起见,Navigation功能 ...
- Linux下PHP安装oci8扩展
PHP通常搭配Mysql使用,但有时候也会连接到Oracle数据库.安装PHP的oci8扩张之前,需要先安装Oracle Instant Client( basic 或 basic lite 版就行了 ...
- WPF Loaded事件连续调用两次的问题
最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句: this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇 ...
- GCD笔记
GCD笔记http://www.cocoachina.com/applenews/devnews/2013/1210/7506_2.html1. 全称Grand Central Dispatch2. ...