JSON 類型已經成為Ajax技術中數據傳輸的實際標准,Jersey 提供了多種處理JSON數據的包和解析方式,下表展示了JSON包和解析方式:
解析方式\JSON支持包 |
MOXy |
JSON-P |
Jackson |
基於POJO的JSON綁定 |
是 |
否 |
是 |
基於JAXB的JSON綁定 |
是 |
否 |
是 |
低級的(逐字的)JSON解析和處理 |
否 |
是 |
否 |
-
使用 MOXy 處理JSON
MOXy 是 EclipseLink項目的一個模塊,是使用JAXB和SDO作為XML綁定的技術基礎,實現了JSR222標准(JAXB2.2)和JSR235標准(SDO2.11),使用MOXy的Java開發者能夠高效的完成Java類和XML綁定,所要的只是使用注解來定義他們之間的關系,同時,MOXy實現了JSR-353標准(Java API for Processing JSON1.0),以JAXB為基礎來實現對JSR353的支持
-
定義依賴
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
-
定義Application
// 該注解用於Servlet3
@ApplicationPath("/api/*")
public class JsonResourceConfig extends ResourceConfig {
public JsonResourceConfig() {
register(MyResource.class);
// 注冊JSON處理
register(MOXyJsonProvider.class);
property(CommonProperties.MOXY_JSON_FEATURE_DISABLE, Boolean.TRUE);
System.out.println("JsonResourceConfig 構造函數調用");
}
}
-
Servlet配置(Servlet3 可以不定義web.xml配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.drsoft.rest.JsonResourceConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
- REST服務代碼
@GET
@Path ("book")
@Produces (MediaType.APPLICATION_JSON)
@Consumes (MediaType.APPLICATION_JSON)
public Book getBook() {
Book newBook = new Book();
newBook.setId(1);
newBook.setName("Java RESTful WebService學習");
Publisher newPublisher = new Publisher();
newPublisher.setName("機械出版社");
newPublisher.setIsbn("989797397342343");
newPublisher.setPublishTime(new Date());
newBook.setPublisher(newPublisher);
return newBook;
}
其中Book類和Publisher類不需要額外處理,MOXy可以根據POJO類來進行JSON綁定,如果需要使用 JAXB 注解本身可以控制一定 JSON 格式輸出,具體來說,直接通過使用 JAXB 注釋很容易做到重命名(@XmlElement)和刪除(@XmlTransient)屬性,示例代碼如下:
@XmlRootElement
public class Publisher {
@XmlElement (name = "n")
private String name;
private String isbn;
private Date publishTime;
@XmlTransient
public Date getPublishTime() {
return publishTime;
}
public void setPublishTime(Date publishTime) {
this.publishTime = publishTime;
}
// setter 和 getter 方法
}
JSON輸出內容如下:
{
"n": "機械出版社",
"isbn": "989797397342343"
}
-
使用JSON-P處理JSON
JSON-P的全稱是Java API for JSON Processing(Java 的JSON處理API),是JSR353標准規范,用於統一Java處理JSON格式數據的API,其生產和消費的JSON數據以流的形式處理,並為JSON數據建立Java對象模型。
-
定義依賴
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
</dependency>
-
定義Application
// 該注解用於Servlet3
@ApplicationPath("/api/*")
public class JsonProcessingResourceConfig extends ResourceConfig {
public JsonProcessingResourceConfig() {
// 注冊REST類
register(MyResource.class);
// 啟用格式化Json數據的輸出
property(JsonGenerator.PRETTY_PRINTING, Boolean.TRUE);
}
}
-
Servlet配置(Servlet3 可以不定義web.xml配置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.drsoft.rest.JsonProcessingResourceConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
- REST服務代碼
@GET
@Path ("bookJsonP")
@Produces (MediaType.APPLICATION_JSON+";charset=UTF-8")
@Consumes (MediaType.APPLICATION_JSON)
public JsonObject getBookByJsonP() {
JsonObjectBuilder publisherObjectBuilder = Json.createObjectBuilder();
publisherObjectBuilder.add("isbn", "939393939393939");
publisherObjectBuilder.add("name", "電子工程也出版社");
publisherObjectBuilder.add("publishTime", new Date().toString());
JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
objectBuilder.add("name", "Java RESTful WebService學習");
objectBuilder.add("id", 999);
objectBuilder.add("publisher", publisherObjectBuilder);
return objectBuilder.build();
}
JSON-P不需要創建POJO類,通過JsonObjectBuilder來創建JsonObject對象,通過該對象輸出Json字符串。