笔记: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 ...
随机推荐
- 编写DAO,通过JdbcTemplate操作数据库的实践
目的:编写DAO,通过Spring中的JdbcTemplate,对数据库中的学生数据进行增删改查操作. 要操作的数据库表结构为: 一.大体框架 1.要利用JdbcTemplate,首先要添加Sprin ...
- 使用java实现阿里云消息队列简单封装
一.前言 最近公司有使用阿里云消息队列的需求,为了更加方便使用,本人用了几天时间将消息队列封装成api调用方式以方便内部系统的调用,现在已经完成,特此记录其中过程和使用到的相关技术,与君共勉. 现在阿 ...
- 工作中常用的linux命令(2)
1.find :查找指定文件名的路径: 列出当前目录以及子目录中的所有文件: 在当前目录下寻找特定文件名的文件: 列出长度为零的文件: 2.ps :查看某个程序的进程,例如查询mongodb和mysq ...
- 解析FAT16文件系统
引导扇区的信息如下: 1. 偏移地址00H,长度3,内容:EB 3C 90 跳转指令. 2. 偏移地址03H,长度8,内容:4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号 ...
- JavaScript总结-网页上显示时间
网页上显示时间 代码如下: <TABLE> <TR> <TD><span id="localtime"></span> ...
- js拖拽分析
js拖拽分析 思路 1.三个鼠标事件,mousedown,mousemove,mouseup 2.可移动性absolute 3.边界限制 得到鼠标点击处和div边界的距离,然后得出top 和 left ...
- HUD-1999-不可摸数
参考博客https://www.cnblogs.com/dongsheng/archive/2012/08/18/2645594.html Problem Description s(n)是正整数n的 ...
- .NET微服务 容器化.NET应用架构指南(支持.NET Core2)
介绍 企业通过使用容器,日益实现成本节约.解决部署问题并改进 DevOps 和生产操作. 通过创建 Azure 容器服务.Azure Service Fabric 等产品,同时与 Docker.Mes ...
- Nginx 配置对流量、连接和请求的限制
首先给出配置段: http { limit_conn_zone $binary_remote_addr zone=one:10m; limit_req_zone $binary_remote_addr ...
- 云计算之路-阿里云上:服务器CPU 100%问题是memcached的连接数限制引起的
非常抱歉,昨天的服务器CPU 100%问题是达到 memcached 的连接数限制引起的,不是阿里云服务器的问题. 之前我们用的是阿里云“云数据库 memcached 版”,上个周末我们换成了自己搭建 ...