rest-assured的对象映射(序列化和反序列化)
rest-assured支持映射Java对象到Json和XML以及从Json和XML中映射到Java对象。Json映射需要在classpath 中有Jackson、Jackson 2或者是Gson,XML映射需要在classpath 中有JAXB。
一、序列化
序列化:序列化Java对象到Json或Xml
假设我们有这样一个Java Object:
public class Message {
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}
我们想序列化这个对象为Json,并且将Json传递给request请求,这里有几种方法可以做到,比如说:
1.基于Content-Type的序列化
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json").
body(message).
when().
post("/message");
在这个例子中,因为请求的content-type被设置为“application/json”,所以rest-assured将序列化这个message对象为Json。rest-assured首先会尝试从classpath中寻找Jackson,如果Jackson没有找到的话,则会使用Gson。如果你将content-type被设置为“application/xml”,rest-assured将使用JAXB,序列化这个message对象为XML。如果content-type没有定义,那么rest-assured将会按照下列顺序序列化对象:
1.使用Jackson 2将对象序列化为Json(Faster Jackson (databind),数据绑定的速度比Jackson快)
2.使用Jackson将对象序列化为Json(databind)
3.使用Gson将对象序列化为Json
4.使用JAXB将对象序列化为XML
同时rest-assured也关心content-type的字符集,比如:
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json; charset=UTF-16").
body(message).
when().
post("/message");
你也可以将message对象序列化为表单参数:
Message message = new Message();
message.setMessage("My messagee");
given().
contentType("application/json; charset=UTF-16").
formParam("param1", message).
when().
post("/message");
这个message对象将会序列化为字符集为UTF-16的Json(使用Jackson 或者 Gson ,如果存在的话)。
2.通过HashMap来创建Json
你可以提供一个Map,rest-assured将会使用这个map创建Json文件
Map<String,Object> map = new HashMap<String,Object>();
map.put("firstName","lwj");
map.put("lastName","nicole"); given().
contentType(JSON).
body(map).
when().
post("/somewhere"").
then().
statusCode(200);
上面的例子会产生一个Json数据:
{ "firstName" : "lwj", "lastName" : "nicole" }
3.使用显示序列化器
如果在你的classpath中同时存在多个Object Mappers(对象映射),或者你并不关心 content-type 的设置,那么你就可以指定一个显示序列化器来进行序列化:比如:
Message message = new Message();
message.setMessage("My messagee");
given().
body(message, ObjectMapperType.JAXB).
when().
post("/message");
在这个例子当中,rest-assured使用JAXB将Message对象序列化为XML。
二、反序列化
反序列化:将响应体反序列化为Java对象
假设我们有这样一个Java对象:
public class Message {
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}
接下来我们想将响应体反序列化为Message 对象:
1.基于Content-Type的反序列化
假设服务端返回这样一个Json数据:
{"message":"My message"}
将这个json数据反序列化为Message对象,我们可以这样做:
Message message = get("/message").as("Message.class");
想要将上面的Json数据反序列化为Message对象,响应体(response)的content-type必须是"application/json"(或者是其他包含json的类型)。
假设服务端返回下面类型的数据(xml):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message>
<message>My message</message>
</message>
并且响应体的content-type是"application/xml",完全不用修改任何代码:
Message message = get("/message").as("Message.class");
1.1 自定义Content-Type反序列化
如果服务端返回一个自定义的Conten-Type,比说:"application/something",你仍然想使用rest-assured的对象映射,那么这里有两个方法可以做到:你可以使用显示指定的方法,或者是为自定义的Content-Type注册一个解析器:
Message message = expect().parser("application/somthing",Parser.XML).when().get("/message").as(Message.class);
或者:
Message message = expect().defaultParser(Parser.XML).when().get("/message").as(Message.class);
当然你也可以注册一个默认解析器或者是静态自定义一个解析器,或者使用specification.
2.使用显示反序列化器
如果在你的classpath中同时有多个对象映射,或者说你并不关心响应体的content-type,你可以指定一个显示的反序列化器,比如:
Message message = get("/message").as(Message.class,ObjectMapperType.GSON);
3.配置(ObjectMapperConfig)
你可以使用ObjectMapperConfig来配置一个预定义的对象映射,并且将其传递到详细配置当中去(detailed configuration),比如:将GSON的命名策略改成LowerCaseWithUnderscores(一种策略,将大写字母改为小写字母并添加下划线),可以这样做:
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(objectMapperConfig().gsonObjectMapperFactory(
new GsonObjectMapperFactory() {
public Gson create(Class cls, String charset) {
return new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
}
}
));
这里为GSON, JAXB, Jackson和Faster Jackson都预定义了对象映射工厂。
4.自定义ObjectMapper
默认情况下,rest-assured将会扫描classpath中各种各样的Object Mappers。如果你想集成一个Object Mappers,默认情况下rest-assured是不支持,或者你自己封装,你可以实现 io.restassured.mapper.ObjectMapper 接口。你需要告诉rest-assured使用你自定义的Object Mappers,或者是将自定义的Object Mappers作为第二个参数传递给body:
given().body(myJavaObject,myObjectMapper).when().post("....");
或者你可以静态定义:
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig(myObjectMapper));
三、自定义解析器
rest-assured提供了预定义的解析器,例如HTML、XML、JSON。但是你可以通过注册一个预定义的解析器来解析一些现在不支持的内容类型,通过以下方法来注册:
RestAssured.registerParser(<content-type>, <parser>);
例如:注册一个可以解析"application/vnd.uoml+xml"类型的解析器,需要使用XML parser这样做:
RestAssured.registerParser("application/vnd.uoml+xml", Parser.XML);
你也可以通过下面的方法来注销解析器:
RestAssured.unregisterParser("application/vnd.uoml+xml");
解析器也可以指定于每一个请求中:
get("...").then().using().parser("application/vnd.uoml+xml", Parser.XML);
然后使用response specification
四、默认解析器
有时候指定一个默认的解析器非常有用,比如:当中响应体中不包含任何content-type的时候:
RestAssured.defaultParser = Parser.JSON;
当然,你也可以为某个请求指定默认解析器:
get("/x").then().using().defaultParser(Parser.JSON). ..
然后使用response specification
rest-assured的对象映射(序列化和反序列化)的更多相关文章
- java中对象的序列化和反序列化
[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...
- Java对象的序列化与反序列化
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...
- Java对象的序列化和反序列化[转]
Java基础学习总结--Java对象的序列化和反序列化 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java对象的序列化与反序列化-Json篇
说到Java对象的序列化与反序列化,我们首先想到的应该是Java的Serializable接口,这玩意在两个系统之间的DTO对象里面可能会用到,用于系统之间的数据传输.或者在RPC(远程方法调用)时可 ...
- 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤
项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...
- 对象的序列化与反序列化---IO学习笔记(四)
对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream) ...
- 第12讲-Java中的IO操作及对象的序列化与反序列化
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 io操作 1.2.2 对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
随机推荐
- http头部信息解析
HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type. 2. Accept-Chars ...
- dojo模块化开发
转自https://www.cnblogs.com/sharpest/p/6242801.html
- c++ 适配器模式(adapter)
当两个系统的接口不一样时,我们就要重新封装一下接口,以便于当前系统的调用.这种模式叫做适配器模式.适配器模式分为两种: 1.对象组合适配器(Object Adapter) 2.类适配器(Class A ...
- linux安全关机脚本
linux安全关机脚本 在断电4分钟后判断关键 目的:在断电以后服务器连接UPS,UPS最多只能支持5分钟也会没电,所以在这里做个判断,如果断电4分钟后,市电还没来就关机. 以下两个设备为两个下路由器 ...
- 数据库 MySQL 之 表操作、存储引擎
数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名( 字段名1 ...
- [GO]随机生成四们数字
package main import ( "math/rand" "time" "fmt" ) func InitData(p *int) ...
- Python实现wc.exe
github传送门 项目相关要求 基本功能 -c file.c 返回文件file.c的字符数 (实现) -w file.c 返回文件file.c的词的数目(实现) -l file.c 返回文件file ...
- android 透明弹出搜索框
1.在QQ一些APP当中有是弹出一个半透明的搜索框的,其实这种效果就是很多种方法,自定义一个Dialog,或者直接将activity的背景变成半透明的也可以的. 下面就是将activity变成半透明的 ...
- Android Activity的切换动画(overridePendingTransition)
overridePendingTransition 1.平时Activity的切换是就是从中间弹出来,然后遮盖住之前的Activity.这种效果看到很多后就想给他换成其他的效果,如: 要显示的Acit ...
- C#中如何向数组中动态添加元素
转自:https://blog.csdn.net/qq_35938548/article/details/78325558 背景:现需要向数组中循环插入字符串,但C#中的数组是不支持动态添加元素的,只 ...