如何反序列化对List <Status> twitter4j

时间:2019-09-01 14:16:12

标签: json deserialization twitter4j rest-assured

我正在使用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对象的数组。

2 个答案:

答案 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解析工具。