XML序列化与杰克逊的反序列化
最后修改:9月30日,2020年
1.概述
在本教程中,我们将会看看如何使用Jackson 2.x将Java对象序列化为XML数据,并将其反向回到POJO。
我们将专注于不需要大量复杂性或自定义的基本操作。
2。XMLMapper.目的
XMLMapper.是来自杰克逊2.x的主类,它有助于我们序列化,因此我们需要创建它的实例:
xmlmapper mapper = new xmlmapper();
这映射器可用Jackson-DataFormat-XMLjar,所以我们必须将其添加为依赖我们的pom.xml.:
<依赖> com.fasterxml.jackson.dataformat groupId> jackson-datomformat-XML Artifactid> 2.11.1 version> 依赖项>
请检查最新版本的jackson-datomformat-xml依赖项在maven存储库中。
3.将Java序列化为XML
XMLMapper.是一个子类ObjectMapper.其中用于JSON序列化。但是,它为父类添加了一些XML特定调整。
我们现在可以查看如何使用它来执行实际的序列化。让我们先创建一个Java类:
class simplebean {private int x = 1;私人int y = 2;//标准安置者和getters}
3.1。序列化到XML细绳
我们可以将Java对象序列化为XML细绳:
@test public void whenjavaserializedtoxmlstr_thencorrect()抛出jsonprocessingexception {xmlmapper xmlmapper = new xmlmapper();字符串XML = XMLMAPPER.WRITEVALUEASTRING(新SimpleBean());assertnotnull(XML);}
结果我们将得到:
1 x> 2 y> simplebean>
3.2。序列化到XML文件
我们还可以将Java对象序列化为XML文件:
@test public void whenjavaserializedtoxmlfile_thencorrect()抛出ioException {xmlmapper xmlmapper = new xmlmapper();xmlmapper.writevalue(新文件(“simple_bean.xml”),新的SimpleBean());文件文件=新文件(“simple_bean.xml”);assertnotnull(文件);}
下面我们可以看到命名的结果文件的内容simple_bean.xml.:
1 x> 2 y> simplebean>
4.将XML反序列为Java
在本节中,我们将研究如何从XML获取Java对象。
4.1。从XML字符串反序列化
与序列化一样,我们也可以将XML字符串反序列为Java对象:
@test公共void whenjavagotfromxmlstr_thencorrect()抛出IoException {XMLMapper XMLMAPPER = New XMLMAPPER();SimpleBean Value = XMLMapper.readValue(“ 1 x> 2 y> simplebean>”,simplebean.class);asserttrue(value.getx()== 1 && value.gety()== 2);}
4.2。从XML文件反序列化
同样,如果我们有XML文件,我们可以将其转换回Java对象。
在这里,我们首先将文件读入输入流,然后将输入流转换为a细绳用简单的实用方法。
其余代码类似于来自第4.1节中的一个代码:
@test public void whenjavagotfromxmlfile_thencorrect()抛出ioException {file file = new文件(“simple_bean.xml”);xmlmapper xmlmapper = new xmlmapper();String XML = InputStreamToString(新FileInputStream(文件));SimpleBean Value = XMLMapper.ReadValue(XML,SimpleBean.class);asserttrue(value.getx()== 1 && value.gety()== 2);}
实用方法:
公共字符串InputStreamToString(InputStream是)抛出IoException {StringBuilder SB = New StringBuilder();弦线;BufferedReader BR =新BufferedReader(新InputStreamReader(IS));虽然((line = br.readline())!= null){sb.append(行);} Br.Close();返回sb.tostring();}
5.处理资本化元素
在本节中,我们将研究如何处理我们将XML具有大写元素的方案来反驳,或者我们需要将Java对象序列化为大写的一个或多个元素的XML。
5.1。从XML反序列化细绳
假设我们有一个带有一个字段的XML:
1 x> 2 y> simplebeanforcapitizedfields>
为了正确处理大写元素,我们需要用“x”字段注释@jsonproperty.注解:
Class SimpleBeanforcapitizedFields {@JSonProperty(“x”)私有int x = 1;私人int y = 2;//标准getters,setter}
我们现在可以正确地反驳XML细绳返回Java对象:
@test公共void whenjavagotfromxmlstrwithcapitalelem_thencorrect()抛出ioException {xmlmapper xmlmapper = new xmlmapper();simplebeanforcapinalizedfields值= xmlmapper.readvalue(“ 1 x> 2 y> simplebeanforcapitizedfields>”simplebeanforcapitizedfields.class);asserttrue(value.getx()== 1 && value.gety()== 2);}
5.2。序列化到XML字符串
通过注释必填字段@jsonproperty,我们可以正确地将Java对象序列化为XML细绳有一个或多个大写元素:
@test public vod whilejavaserializedtoxmlfilewithcapitalizedfield_thencorrect()抛出IoException {XMLMapper XMLMAPPER = New XMLMapper();xmlmapper.writevalue(新文件(“target / simple_bean_capitalized.xml”),new simplebeanforcapitizedfields());文件文件=新文件(“target / simple_bean_capitalized.xml”);assertnotnull(文件);}
6。连载列表到XML
这XMLMapper.能够将整个Java Bean序列化为文档。要将Java对象转换为XML,我们将使用嵌套对象和数组进行一个简单的示例。
我们的意图是序列化a人对象,以及其组成地址对象,进入XML。
我们的最终XML看起来像:
rohan firstname> daye lastname> 9911034731 phoneNumbers> 9911033478 phoneNumbers> phoneNumbers> <地址> name1 Streetname> City1 City> 地址> <地址> Name2 Streetname> City2 City> 地址> person>
请注意,我们的电话号码封装在一个电话号码我们的地址不是的套装。
我们可以通过@jacksonxmalementWrapper.在我们的诠释人班级:
公共最终类人{私有字符串名字;私有字符串LastName;私有列表 phonenumbers = new arraylist <>();@jacksonxmalelementwrapper(usewrapping = false)私有列表<地址>地址= new arraylist <>();//标准安置者和getters}
实际上,我们可以用换包元素名称@jacksonxmalElementWrapper(localname ='phonenumbers')。或者,如果我们不想包装我们的元素,我们可以禁用映射@jacksonxmalelementWrapper(使用wrapping= false)。
然后让我们定义我们的地址类型:
公共类地址{String StreetName;弦城;//标准安置者和getters}
杰克逊照顾我们的休息。像之前一样,我们可以简单地打电话writevalue.再次:
私有静态最终字符串XML =“ ... person>”;@test public void whenjavaserializedtoxmlfile_thensccess()抛出IoException {XMLMapper XMLMapper = New XMLMapper();人物= testperson();//测试数据bytearrayoutputstream bytearrayoutputstream = new bytearrayoutputstream();xmlmapper.writevalue(bytearrayoutputstream,person);assertequals(xml,bytearrayoutputstream.tostring());}
7.将XML反序列化为列表
杰克逊可以读取包含对象列表的XML。
如果我们以前携带相同的XML,那么ReadValue.方法只是很好:
@test public void whenjavadeserialized fromxmlfile_thencorrect()抛出IoException {XMLMapper XMLMAPPER = New XMLMapper();person value = xmlmapper.readvalue(XML,person.class);assertequals(“city1”,value.getAddress()。获取(0).getcity());assertequals(“city2”,value.getAddress()。Get(1).getCity());}
结论
这个简单的文章说明了如何将简单的POJO序列化为XML并从基本XML数据获取POJO。
我们还研究了如何序列化和反序列化包含集合的复杂豆类。
伴随本文的源代码可用GitHub.。