java 如何提取对字符串的响应并将其保存到变量

brvekthn  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(163)

作为Java/JSON/REST Assured主题的新手,我想提取“token”的一个参数:从JSON响应体中提取一个字符串,并将其存储为变量,我可以将其带到其他一些类中并在那里使用。但是,我已经尝试过了,但还没有找到方法。下面是我在开始时创建的代码的一部分,创建的方式与存储在该类中的其他请求相同,但这是我需要从响应中获取某些内容的第一个代码:

public FakeTokenVO fakeToken() {         
  String payload = "payloadthere";         
  return given(specBuilder.fakeTokenRequestSpecification())                 .
       body(payload)                 
      .log().all()                 
      .when()                 
      .post(RestApiRoutes.FAKE_URI)                 
      .then()                 
      .log().all()                
      .extract()                 
      .response()                 
      .as(FakeTokenVO.class); 
}

不要在意负载和那些VO类,因为它作为数据模型存储在其他地方。请求的响应如下所示:

{
    "createTokenResponse": {
        "createTokenSuccess": {
            "token": "token_with_somewhere_about_700_characters"
        }
    }
}

下面是我如何尝试修改它以获得我稍后需要的响应部分(授权其他请求的令牌):

@Test     
public void fakeToken() 
{ 
    String payload = "payloadthere";         
    String token = given(specBuilder.fakeTokenRequestSpecification())             
    .body(payload)             
    .log().all()             
    .when()             
    .post(RestApiRoutes.FAKE_URI)             
    .then()             
    .log().all()             
    .extract()             
    .response()             
    .body().path("createTokenResponse.createTokenSuccess.token");          
    System.out.print(token);     
}

此测试返回了我需要的值,但我不知道如何将其实现为方法而不是测试。请帮助我如何处理它?我遗漏了什么?我尝试搜索答案,但尚未找到解决方案或不知道如何在我的代码部分中实现它。

vfh0ocws

vfh0ocws1#

我假设你可以得到一个字符串形式的响应。所以你所需要做的就是解析你的Json字符串。为此你可以使用任何可用的Json解析器。最流行的是Json-Jackson(也被称为Faster XML)或Gson(由Google提供)。这两种解析器都是非常有名和流行的。(我个人更喜欢Jackson,但这是一个观点问题)。
然而,对于这种简单的情况,我编写了自己的实用程序(Jackson库上的一个薄 Package 器),它允许您非常简单地解析Json String,而无需学习相对复杂的库。

try {
    Map<String, Object> map = JsonUtils.readObjectFromJsonString(jsonStr, Map.class);
    Map<String, Object> innerMap = map.get("createTokenResponse");
    Map<String, Object> innerMap2 = map.get("createTokenSuccess");
    String token = innerMap.get("token");
} catch (IOException e) {
    e.printStacktrace();
}

也可以创建自己的类,例如

public class TokenResult {
    String token;
    //getter and setter
}

public class TokenHolder {
    private TokenResult createTokenSuccess;
    //setter and getter
}

public class TokenResponse {
    private TokenHolder createTokenResponse;
    //setter and getter
}

然后你的代码可能看起来像这样:

try {
    TokenResponse response = JsonUtils.readObjectFromJsonString(jsonStr, TokenResponse .class);
    String token = response.getCreateTokenResponse().getCreateTokenSuccess().getToken();
} catch (IOException e) {
    e.printStacktrace();
}

这是JsonUtils类的Javadoc。此实用程序是我编写和维护的开放源代码MgntUtils库的一部分。您可以在Maven Central heregithub上获得作为maven工件的库(包括源代码和javadoc)

相关问题