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客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
随机推荐
- 01.webservice介绍
不实现异构,实现远程系统之间的调用.
- 【bzoj1017】[JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1658 Solved: 755[Submit][S ...
- xgboost 调参参考
XGBoost的参数 XGBoost的作者把所有的参数分成了三类: 1.通用参数:宏观函数控制. 2.Booster参数:控制每一步的booster(tree/regression). 3.学习目标参 ...
- lambda,map,filter,reduce
lambda 编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数.返回一个函数对象. func = lambda x,y:x+y fu ...
- JavaWeb中的路径问题
JavaWEB 开发中的 / 的含义 ①.当前WEB应用的根路径(http://localhost:8080/contextPath/) 请求转发时:request.getRequestDispath ...
- Linux命令累积
常用命令 ipconfig -查看本机ip.接口等信息 ping ip -ping远程服务器或终端 cd ~ -返回根目录 cd .. 返回上级目录 cd ../.. 返回上两级目录 ...
- C# JSON使用的常用技巧(二)
JSON在php里一句json_encode就可以得到 在C#里我们同样也很容易的可以得到 用到的类库:Newtonsoft.Json.dll 实体类: class Cat { public stri ...
- C++中的Trivial 、POD、non-POD和Standard Layout概念
POD types non-POD types Standard Layout types A Formal Definition Informally, a standard layout clas ...
- 【实习项目记录】(二) JSON
介绍 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Program ...
- 关于在jeecms中css,图片,html,模板是如何组装成——part2
这是index.html折叠后的代码可以看出4部分:header+div+footer+right-fixed 好,先解决自己的第一个疑问,home.css是如何让一个巨丑无比的老汉子,变为年少的小欧 ...