笔记:Jersey REST 传输格式-JSON
Posted 追寻自由的路途
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记:Jersey REST 传输格式-JSON相关的知识,希望对你有一定的参考价值。
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字符串。
? ?
? ?
以上是关于笔记:Jersey REST 传输格式-JSON的主要内容,如果未能解决你的问题,请参考以下文章
Java Rest Jersey:发布多种类型的数据(文件和JSON)
Jersey REST 服务调用另一个 Jersey REST 服务时出错 - java.lang.IllegalArgumentException:参数类型不匹配