这篇文章主要介绍“JAVA如何基于SnakeYAML实现序列化YAML”,在日常操作中,相信很多人在JAVA如何基于SnakeYAML实现序列化YAML问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“JAVA如何基于SnakeYAML实现序列化YAML”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
<强> 1。概述强>
本文,我们将学习如何使用SnakeYAML库将
YAML文档转换为JAVA对象,以及JAVA对象如何序列化为YAML文档。
<强> 2。项目设置强>
要在项目中使用SnakeYAML,需要添加Maven依赖项(可在此处找到最新版本):
& lt; dependency>,& lt; groupId> org.yaml,& lt; artifactId> snakeyaml,& lt; version> 1.25 & lt;/version> & lt;/dependency>
<强> 3。入口点强>
该YAML类是API的入口点:
YAML YAML=new YAML ()
由于实现不是线程安全的,因此不同的线程必须具有自己的YAML实例。
<强> 4。加载YAML文档强>
SnakeYAML支持从字符串或InputStream加载文档,我们从定义一个简单的YAML文档开始,然后将文件命名为客户。yaml:
firstName:“John"姓:“Doe"年龄:20
4.1基本用法
现在,我们将使用yaml类来解析上述yaml文档:
yaml yaml=new yaml (); InputStream InputStream=this.getClass () .getClassLoader () .getResourceAsStream (“customer.yaml"); Map<字符串,Object>obj=yaml.load (inputStream); System.out.println (obj);
上面的代码生成以下输出:
{firstName=约翰,lastName=能源部,年龄=20}
默认情况下,负载()方法返回一个地图对象。查询地图对象时,我们需要事先知道属性键的名称,否则容易出错。更好的办法是自定义类型。
4.2自定义类型解析
SnakeYAML提供了一种将文档解析为自定义类型的方法
让我们定义一个客户类,然后尝试再次加载该文档:
公共类客户{,私人字符串firstName;,私人字符串姓;,私人int年龄;,//getter和setter}
现在我么来加载:
Yaml Yaml=new Yaml (); InputStream InputStream=this.getClass () .getClassLoader () .getResourceAsStream (“customer.yaml");客户客户=yaml.load (InputStream);
还有一种方法是使用构造函数:
Yaml Yaml=new Yaml(新构造函数(Customer.class));
4.3隐式类型
如果没有为给定属性定义类型,则库会自动将值转换为隐式类型。
例如:
1.0→Float42→Integer2009-03-30→日期
让我们使用一个TestCase来测试这种隐式类型转换:
@Testpublic空白whenLoadYAML_thenLoadCorrectImplicitTypes () {, Yaml Yaml=new Yaml ();对象,Map< Object>文档=yaml.load (“3.0: 2018 - 07 - 22“);,assertNotNull(文档);,assertequal (document.size ());,assertTrue (document.containsKey (3.0 d));,}
4.4嵌套对象
SnakeYAML支持嵌套的复杂类型。
让我们向“客户。yaml“添加“联系方式”和“地址”详细信息,并将新文件另存为customer_with_contact_details_and_address.yaml。.
现在,我们将分析新的YAML文档:
firstName:“John"姓:“Doe"年龄:31 contactdetails:, -类型:“mobile",数量:123456789,-类型:“landline",号码:456786868 homeaddress:,:“Xyz, DEF Street",城市:“城市Y",状态:“国家Y",邮政编码:345657
我们来更新java类:
公共类客户{,私人字符串firstName;,私人字符串姓;,私人int年龄;,私人List
现在,我们来测试下Yaml #负荷():
@Testpublic空白whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObjectWithNestedObjects () {,Yaml Yaml=new Yaml(新构造函数(Customer.class));,InputStream InputStream=this.getClass (),.getClassLoader (),.getResourceAsStream (“yaml/customer_with_contact_details_and_address.yaml");,客户客户=yaml.load (inputStream);,assertNotNull(客户);,assertequal (“John" customer.getFirstName ());,assertequal (“Doe" customer.getLastName ());customer.getAge, assertequal(31日());,assertNotNull (customer.getContactDetails ());,assertequal (2, customer.getContactDetails () .size ());,,assertequal (“mobile" customer.getContactDetails (),. get (0),. gettype ());,assertequal (123456789, customer.getContactDetails (),. get (0),.getNumber ());,assertequal (“landline" customer.getContactDetails (),. get (1),. gettype ());,assertequal (456786868, customer.getContactDetails (),. get (1),.getNumber ());,assertNotNull (customer.getHomeAddress ());,assertequal (“Xyz, DEF Street", customer.getHomeAddress (),null