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 知识点进行复习和学习一番,大 ...
随机推荐
- JavaScript 三个组成部分
1.核心(ECMAScript) ECMAScript 仅仅是一个描述,定义了脚本语言的所有属性.方法和对象.其他语言可以实现 ECMAScript 来作为功能的基准,JavaScript 就是这样: ...
- UI基础
知识点一:OC不允许直接修改对象的结构体属性的成员,允许直接修改对象的结构体属性 示例代码: CGRect tempFrame = self.frame; tempFrame.origin.x += ...
- js中创建数组的方法
1.声明或创建一个不指定长度的数组(Array)的方式为: 如:var arrayObj = new Array(); 2.声明或创建一个数组并指定长度的数组(Array)的方式为: 如:var ar ...
- ubuntu14.04上Trac配置记录
系统环境:ubuntu14.04 (并假设Apache2服务可以正常运行) 1. 安装软件: sudo aptitude install trac python-mysqldb 2. 创建数据库Tra ...
- VMware克隆虚拟机,克隆机网卡启动不了解决方案
Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interfac ...
- openssl证书制作详细教程
自签名证书及验证 模拟证书涉及的角色 创建证书目录 mkdir ~/certs cd ~/certs 认证机构.网站.浏览器/用户 mkdir root web user 机构自签名证书生成和发布 生 ...
- C++单元测试 之 gtest -- 组合数计算.
本文将介绍如何使用gtest进行单元测试. gtest是google单元测试框架.使用非常方便. 首先,下载gtest (有些google项目包含gtest,如 protobuf),复制目录即可使用. ...
- 关于java8 interface的default方法
转自鸟窝 博主写的挺详细,不了解的看一看啊 以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implem ...
- <<你最喜欢做什么--兴趣问题清单>>总结
二.测试作业 你最喜欢做什么--兴趣问题清单 •根据迄今为止已有的经历,你真正喜欢从事的工作是什么? 目前还没有接触工作,就工作而言,凭自己所学的本领和技术去工作,我认为我会喜欢我所做的工作 •休 ...
- B树系列
参见 http://blog.csdn.net/quitepig/article/details/8041308