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客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
随机推荐
- ASP.NET MVC 和 WebForm的权限控制
今天主要讲一下对于ASP.NET的页面级权限控制 数据结构:用户表.角色表.权限表.角色权限派生表 为用户添加权限的数据配置后, 自定义类对MVC继承Controller 对其内置方法Initiali ...
- 【codevs2495】水叮当的舞步
题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ ...
- php-fpm, nginx ,fastcgi ,php-cgi 关系粗解
首先,CGI 是干什么的? CGI 是为了保证web server传递过来的数据是标准格式.CGI 是个协议和 进程没什么关系. CGI 是http服务器于你的本机或者其他电脑上的程序交谈的一种工 ...
- GROUP BY ROLLUP和CUBE 用法
ROLLUP和CUBE 用法 Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句. 如果是Group by ROLLUP(A, B, C)的话 ...
- linux下的同步与互斥
linux下的同步与互斥 谈到linux的并发,必然涉及到线程之间的同步和互斥,linux主要为我们提供了几种实现线程间同步互斥的 机制,本文主要介绍互斥锁,条件变量和信号量.互斥锁和条件变量包含在p ...
- Django-----restframework图解
- 第一次C语言作业:博客随笔
1)你觉得大学和高中有什么差别?具体学习上哪? 大学自主学习较多,锻炼自己独立的品质.在学习上,增加了课程的深度和难度,由更多的活动. 2)我希望大学的师生关系是?阅读上述博客后对师生关系有何感想? ...
- rest-framework之序列化组件
一:django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers def test(re ...
- Struts2 校验数据问题
我们会经常遇到一下问题,例如我在前端输入数据,把数据发送到和后台,我首先要校验这个数据, 比如说:前端必须输入一个日期类型的数据,后端才能正确接收,要是输入一个不是日期型的数据, 那么后端就要把数据打 ...
- Java 之集合框架