文章21 | 阅读 8244 | 点赞0
摘要: JAXB 作为JDK的一部分,能便捷地将Java对象与XML进行相互转换,本教程从实际案例出发来讲解JAXB 2 的那些事儿。完整版目录
前面介绍的全都是关于XML的,其实,JAXB还间接支持与JSON的转换。
JAXB已经包含在了JDK中,不需要任何依赖就可以支持与XML的交互,但是对于JSON,需要添加 MOXy。Moxy扩展了JAXB,使其更强大,这里我只介绍它对JSON的支持情况。
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.7.3</version>
</dependency>
还是之前最熟悉的Java bean :
package com.example.demo.lesson18;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name= "Employee")
public class Employee {
private String id;
private String name;
// setters,getters
}
在和Java bean相同的包中,需要添加JAXB的配置文件。通过这种方式将JAXB的实现交给 MOXy
jaxb.properties
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
将 jaxb.properties 放置到和Employee相同的包中。
先来看一下如何将Java对象映射成JSON数据:
@Test
public void objToJSON() throws JAXBException {
JAXBContext context = JAXBContext.newInstance(Employee.class);
Employee e = new Employee();
e.setId("1801");
e.setName("Dev");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.marshal(e, System.out);
//{"Employee":{"id":"1801","name":"Dev"}}
}
和之前的序列化代码相比,多了一行:
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
就是多的这一行配置,使得输出结果由XML变为了JSON:
{"Employee":{"id":"1801","name":"Dev"}}
这样的JSON看起来不够直观,我们之前有个参数可以控制格式化,试一下看JSON格式行不行。
@Test
public void objToJSON2() throws JAXBException {
JAXBContext context = JAXBContext.newInstance(Employee.class);
Employee e = new Employee();
e.setId("1802");
e.setName("Dev");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.marshal(e, System.out);
输出的结果:
{
"Employee" : {
"id" : "1802",
"name" : "Dev"
}
}
嗯,和预期结果一致。
不过,有时候,我们不希望根节点"Employee"出现,而直接显示数据,就可以加一行配置:
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
输出的结果:
{
"id" : "1803",
"name" : "Dev"
}
MOXy 还提供了多种配置可以适应不同的JSON输出,我就不一一列举了。
与XML到Java对象一样,反序列化的过程就是Unmarshaller
@Test
public void JSONtoObj() throws JAXBException {
JAXBContext context = JAXBContext.newInstance(Employee.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
String json = "{\"Employee\":{\"id\":\"1801\",\"name\":\"Dev\"}}";
unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, true);
Employee employe = (Employee)unmarshaller.unmarshal(new StringReader(json));
System.out.println(employe);//Employee [id=1801, name=Dev]
}
最关键的配置就是指定数据类型的这一行:unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
利用JAXB来处理JSON的场景不多见,在处理JSON时,像 jackson 、GSON、fastjson等大量被使用的框架更有广阔的天地。本节内容只是想展示一下JAXB可以用来处理JSON,但不建议在项目中使用。
可以在GitHub找到完整代码。
本节代码均在该包下:package com.example.demo.lesson18;
下一节开始,讲述JAXB在Spring项目中的使用场景。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://jiangchao.blog.csdn.net/article/details/84728948
内容来源于网络,如有侵权,请联系作者删除!