笔记:Jersey REST 传输格式-JSON

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

?
?

?
?

时间: 2024-10-26 08:46:34

笔记:Jersey REST 传输格式-JSON的相关文章

笔记:Jersey REST 传输格式

通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.short.int.long).2种浮点类型(float.double).Unicode编码的字符(char)和布尔类型(boolean),Jersey 支持全部的基本类型,还支持与之相关的引用类型,示例代码如下: REST 服务代码 @POST @Path("b") public String

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

'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-ui' //使用elementui的提示显示 import { Loading } from 'element-ui' import router from "../router"; let loading function startLoading() { loading = Loadin

UI学习笔记---第十六天XML JSON解析

一.解析的基本概念 从事先规定好的格式中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据,数据方按照格式获取数据 常见解析方式XML解析JSON解析 二.XML:可扩展标记语言 XML数据格式的功能:数据交换 web服务  内容管理  用作配置文件 一对标签称为一个节点  节点可以包含节点   没有子节点叫叶子节点  只有一个根节点  节点可以相互嵌套 三.进行XML解析时使用到的SAX工具 SAX:Simple API for XML  基于事件驱动的解析方式,逐行解析数据.(

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

?图解?TCP/IP? 第六章?TCP与UDP? ?笔记6.1 传输层的作用 ? 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程序所有进行处理的具体程序. ? 6.1.1 传输层定义 6.1.2 通信处理 ? 6.1.3 两种传输层协议 TCP和UDP TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,你可以把它想象成排水管道中的水流. UDP 是不具有可靠性的数据包协议 .细微的处理会交给上层的应用去完成.在U

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

什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于机器解析与生成.JSON是在AJAX中代替XML交换数据的更佳方案. JSON格式与语法 var jsonobject={        //对象内的属性语法(属性名与属性值是成对出现的)        propertyname:value, //对象内的函数语法(函数名与函数内容是成对出现的)  

QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)

//功能:    根据一个URL地址将数据保存到指定路径下,支持断点续传//参数:    url            --需要访问的URL地址//         SavePath       --需要保存的路径//DownedSize 已经下载的大小// totalSize 文件总大小//返回值:  ture --成功 false --失败bool HttpGet::DownFile(const QUrl &url,const QString &SavePath,int DownedS

Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 package springboot01cache.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; im

java学习笔记(12) —— Struts2 通过 xml /json 实现简单的业务处理

XML 1.引入dom4j-2.0.0.jar 2.引入jquery-1.8.2.js 3.新建common.js getInfo = function(){ $.post("getXmlAction.action",{name:$('#name').val()},function(ret,status){ if("success" == status) var id = $(ret).find("id").text(); var age = $

Spring MVC返回Map格式JSON数据

问题描述: ajax中走error : function(e) {} 问题背景: 在测试controller层时,试过了ResponseEntity<ResponseModel>这种类型返回,这是可行的,但是出于好奇,想看看Map返回可不可行.结果出乎我预料,返回Map时JSP页面总是走error : function(e) {},这就奇怪了,刚才用ResponseEntity返回可行,而Map为什么不行呢?于是就查了ajax走error:function的原因, 原因: 1. 后台出错 2.