我正在使用Rest-assured和twitter4j来测试twitter API。
所有调用都通过RestAssured进行,twitter4j用于Json响应反序列化。
我想做的是反序列化来自Twitter的Json响应-GET statuses/home_timeline
,它返回状态对象数组(来自twitter4j)。
我可以像下面这样轻松地反序列化一个Status对象:
@Test
public void verifyTwitCreation() {
RequestSpecification spec = new RqBuilder()
.withStatus(textToPublish)
.build();
Response response = twitClient.createTwit(spec);
assertResponseCode(response, 200);
String json = response.getBody().asString();
Status status = null;
try {
status = TwitterObjectFactory.createStatus(json);
} catch (TwitterException e) {
e.printStackTrace();
}
System.out.println(status.toString());
}
但是我不知道如何反序列化此类Status对象的数组。
答案 0 :(得分:0)
我有点解决我的问题。我只是使用这个插件https://plugins.jetbrains.com/plugin/8634-robopojogenerator从Json生成了POJO,然后使用了确保放心的
映射了Json。List<Status> statuses = Arrays.asList(response.as(Status[].class));
但是我仍然会感谢使用twitter4j解决方案的答案
答案 1 :(得分:0)
尝试使用JsonPath提取状态列表,然后使用TwitterObjectFactory
解析它们:
Response response = twitClient.createTwit(spec);
List<Map<Object, Object>> responseList = response.jsonPath().getList("$");
ObjectMapper mapper = new ObjectMapper();
List<Status> statuses = responseList.stream().map(s -> {
Status status = null;
try {
String json = mapper.writeValueAsString(s)
status = TwitterObjectFactory.createStatus(json);
} catch (TwitterException | IOException e) {
e.printStackTrace();
}
return status;
}).collect(Collectors.toList());
您可以在解析过程中将try / catch移到单独的方法,这样看起来更好:
public class TestClass {
@Test
public void verifyTwitCreation() {
RequestSpecification spec = new RqBuilder()
.withStatus(textToPublish)
.build();
Response response = twitClient.createTwit(spec);
List<Map<Object, Object>> responseList = response.jsonPath().getList("$");
List<Status> statuses = responseList.stream().map(TestClass::createStatus)
.collect(Collectors.toList());
}
private static Status createStatus(Map<Object, Object> jsonMap) {
Status status = null;
ObjectMapper mapper = new ObjectMapper();
try {
String json = mapper.writeValueAsString(jsonMap);
status = TwitterObjectFactory.createStatus(json);
} catch (TwitterException | IOException e) {
e.printStackTrace();
}
return status;
}
}
更新: 由于JsonPath getList()返回地图列表,我们应该将所有地图转换为JSON字符串,以便TwitterObjectFactory可以使用它。在示例中使用了Jackson的ObjectMapper,但是可以使用任何JSON解析工具。