JAVA如何基于SnakeYAML实现序列化YAML

介绍

这篇文章主要介绍“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年龄;,私人ListcontactDetails;homeAddress,私人地址;,,//getter和setter}{公开课接触,私人字符串类型;,私人int数;,//getter和setter}{公共类地址,私人字符串行;城市,私人字符串;,私人弦状态;,私人整数邮政;,//getter和setter}

现在,我们来测试下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

JAVA如何基于SnakeYAML实现序列化YAML