JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式:

解析方式\JSON支持包

MOXy

JSON-P

Jackson

基于POJO的JSON绑定

基于JAXB的JSON绑定

低级的(逐字的)JSON解析和处理

  1. 使用 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"

}

 
 

  1. 使用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的更多相关文章

  1. 笔记:Jersey REST 传输格式

    通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.sho ...

  2. 笔记:Jersey REST 传输格式-XML

    XML类型是使用最广泛的数据类型,Jersey 对XML类型的数据处理,支持Java领域的两大标准,即JAXP(Java API for XML Processing,JSR-206)和JAXB(Ja ...

  3. ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml

    由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...

  4. 在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)

    'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-u ...

  5. 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  6. 数据交换格式 —— JSON(JavaScript Object Notation)

    当请求 headers 中,添加一个name为 Accept,值为 application/json 的 header(也即"我"(浏览器)接收的是 json 格式的数据),这样, ...

  7. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

     图解 TCP/IP  第六章 TCP与UDP   笔记6.1 传输层的作用   传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...

  8. javascript中字符串格式json如何转化成json对象

    什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于 ...

  9. 【转】[WCF REST] 帮助页面与自动消息格式(JSON/XML)选择

    可以说WebHttpBinding和WebHttpBehavior是整个Web HTTP编程模型最为核心的两个类型,前者主要解决消息编码问题,而余下的工作基本上落在了终结点行为WebHttpBehav ...

随机推荐

  1. gitlab启用https

    为了防止内网渗透,将gitlab服务的访问添加了ssl,具体步骤如下: 修改配置文件 [xieshuang@VM_177_101_centos gitlab]$ sudo vim /etc/gitla ...

  2. AttributeError: 'TestLogin' object has no attribute 'driver' in Pycharm for python selenium

    自动化测试学习中的问题: 最近几天在写登陆测试,遇到一个问题,困惑我的几个小时......... 我各种百度,花费大量时间,才找到我的问题的根本所在,最终解决了我的问题,主要是大小写的问题def Se ...

  3. 4.2 PCIe体系结构的组成部件

    PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备,当然PCIe总线也可以连接其他处理器系统.在不同的处理器系统中,PCIe体系结构的实现方法略有不 ...

  4. R语言与格式、日期格式、格式转化

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言的基础包中提供了两种类型的时间数据,一类 ...

  5. VxWorks启动流程

    镜像种类不同,VxWorks的启动过程会有所不同. 我们项目中使用的是加载型VxWorks镜像 函数 函数功能 所在文件 bootTask() (a)    通过createBootLineFromF ...

  6. spring ioc(反转控制)

    在Java中,我们建立一个对象的方式是new,有时需要单例,有时需要工厂,而spring中的bean的定义可以直接使用,如scope属性single产生单例对象,prototype产生新对象,bean ...

  7. class-逻辑回归与最大熵模型

    我们知道,线性回归能够进行简单的分类,但是它有一个问题是分类的范围问题,只有加上一个逻辑函数,才能使得其概率值位于0到1之间,因此本次介绍逻辑回归问题.同时,最大熵模型也是对数线性模型,在介绍最大熵模 ...

  8. 【原】spring boot添加cros全局过滤器

    新增一个过滤器类并实现filter接口 public class CorsFilter implements Filter { final static org.slf4j.Logger logger ...

  9. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

  10. WPF自学入门(四)WPF路由事件之自定义路由事件

    在上一遍博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件.接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧. 创建自定义路由事件分为3个步骤: 1.声明并注册 ...