笔记: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的更多相关文章
- 笔记:Jersey REST 传输格式
通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.sho ...
- 笔记:Jersey REST 传输格式-XML
XML类型是使用最广泛的数据类型,Jersey 对XML类型的数据处理,支持Java领域的两大标准,即JAXP(Java API for XML Processing,JSR-206)和JAXB(Ja ...
- ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml
由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...
- 在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)
'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-u ...
- 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 数据交换格式 —— JSON(JavaScript Object Notation)
当请求 headers 中,添加一个name为 Accept,值为 application/json 的 header(也即"我"(浏览器)接收的是 json 格式的数据),这样, ...
- 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用
图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...
- javascript中字符串格式json如何转化成json对象
什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于 ...
- 【转】[WCF REST] 帮助页面与自动消息格式(JSON/XML)选择
可以说WebHttpBinding和WebHttpBehavior是整个Web HTTP编程模型最为核心的两个类型,前者主要解决消息编码问题,而余下的工作基本上落在了终结点行为WebHttpBehav ...
随机推荐
- hadoop性能调优
1.平衡磁盘利用率 hadoop balancer -Threshold 20 或者 sh $HADOOP_HOME/bin/start-balancer.sh –t 20% 参数20是比例参数,表示 ...
- jquery 上传图片转为base64,ajax提交到后台
支持多张图片上传.图片上传数量修改.可以删除 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- python︱模块加载(pip安装)以及pycharm安装与报错解决方式
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 准备放下R开始学python,真是痛苦,因为找 ...
- dojo之dojox/data/CsvStore初始化
dojo之dojox/data/CsvStore初始化 1.var csvStore = new dojox.data.CsvStore({url:"student.csv"}); ...
- 运行项目Tomcat报错
1.具体报错如下: Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the serve ...
- RAPIDIO高速串行协议
RapidIO是由Motorola和Mercury等公司率先倡导的一种高性能. 低引脚数. 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放式互连技术标准.RapidI ...
- 【原】eclipse创建maven工程时,如何修改默认JDK版本?
问题描述:eclipse建立maven项目时,JDK版本默认是1.5,想创建时默认版本设置为1.8,如何修改? 解决方案: 找到本机maven仓库存放位置,比如:${user.home}/.m2/路径 ...
- Struts2(五)常量的配置
Struts2 常量大多在 默认的配置文件中已经配置好,但根据用户的需求不同,开发的要求不同,需要修改这些常量值,修改的方法就是在配置的文件对常量进行重新配置 在struts.xml 文件中使用< ...
- OpenStack_I版 4.Dashboard部署
由python的DjangoWeb框架开发的 使用keystone默认的角色来访问各种服务 Dashboard安装 Dashboard是openstack的Web管理界面,需要将它 ...
- HDU5779 Tower Defence
dp[i][j][k] 已选i个人 选到第j层 第j层有k个人 讨论相邻层 上一层选了l人 那么共有 两层之间的方案数 以及这一层自己的方案数 #include<bits/stdc++.h&g ...