作为Java/JSON/REST保证主题的新手,我想从JSON响应体中提取"token"参数作为字符串并将其存储为变量,我可以将其带到其他一些类并在那里使用。然而,我试过了,还没有找到方法。下面是我在开始时以与该类中存储的其他请求相同的方式创建的代码的一部分,但这是我需要从响应中获取某些内容的第一个代码:
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);
}
这个测试返回我需要的值,但我不知道如何将其实现为方法而不是测试。请帮助我如何处理它?我错过了什么?我试图寻找答案,但我还没有找到一个解决方案,或者不知道如何在我的代码部分实现它。
我假设您可以将响应作为字符串。你需要做的就是解析Json String。为此,您可以使用任何可用的Json解析器。最流行的是Json-Jackson(也称为Faster XML)或Gson(由Google开发)。两者都很有名,很受欢迎。(我个人更喜欢杰克逊,但这是个人意见的问题)。
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或github(包括源代码和javadoc)上以maven工件的形式获得该库