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字符串。
?
?
?
?