JAXB 深入显出 - JAXB 教程 JAXB与JSON

x33g5p2x  于2021-12-28 转载在 其他  
字(3.2k)|赞(0)|评价(0)|浏览(361)

摘要: 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 bean 到 JSON

先来看一下如何将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输出,我就不一一列举了。

JSON 到 Java 对象

与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项目中的使用场景。

相关文章