1. 程式人生 > >JAXB 深入顯出 - JAXB 教程 JAXB與JSON

JAXB 深入顯出 - JAXB 教程 JAXB與JSON

摘要: 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專案中的使用場景。