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