【问题标题】:RestAssured ResponseBodyExtractionOptions: How to filter json objects from jsonRestAssured ResponseBodyExtractionOptions:如何从 json 中过滤 json 对象
【发布时间】:2018-07-12 00:11:58
【问题描述】:

我有一个响应的端点

{
  "fruits" : {
    "apple" : "green",
    "banana" : 99,
    "oranges" : "floridaBreed",
    "lemons" : "sicilian",
    "grapes" : "red",
    "cherries" : 12,
    "guava" : "sour",
    "tomato" : 13,
    "melons" : "yellow",
    "pomegranate" : 37,
  },
  "isRaw" : null,
  "foodtype" : {
    "typeOne" : "non-veg",
    "typeTwo" : "veg"
  },
  "isCooked" : [ ],
  "isReady" : [ ],
  "isExpired" : [ ],
  "isHealthy" : null,
  "serialnumber" : 5555,
  "isAvailable" : "Yes",
  "dietValue" : {
      "nutrition" : [ {
          "vitamin" : "yes",
          "vitaminValue" : 3
      }, {
          "calcium" : "no",
          "calciumValue" : 0
      } ]
  },
  "isEdible" : null
}

我有一些代码可以得到这个,有点我无法得到嵌套的值对象。例如,我可以获得'isAvailable' 的值,即='yes' 但是如果我想获得'grapes' 或'calcium' 的值,那么它不起作用。有什么想法吗?

public String sendGetMessageValue(String messageId) {
    Map<String, String> response = doInternalModuleApiGet(messageId, 200);

    return response.get("fruits.grapes");
}

public Map<String, String> doInternalModuleApiGet(
        String messageId,
        int expectedStatus) {
    String url = getInternalUrl() + "/" + messageId;
    return sendHttpGetRequestAndGetResponse(url, expectedStatus).as(Map.class);
}


private ResponseBodyExtractionOptions sendHttpGetRequestAndGetResponse(String url, int expectedStatus) {
return given()
        .header("Authorization", "basic " + B64Code.encode("dummyuser:dummypass"))
        .get(url)
        .then()
        .log().ifError().and()
        .assertThat().statusCode(equalTo(expectedStatus)).and().extract().body();
}

public String getInternalUrl() {
    return ("http://127.0.0.1:8080/api");
}

【问题讨论】:

  • 为什么你不让杰克逊反序列化 JSON
  • 我不知道,可以。可以举个例子吗
  • 或使用@Rohan Kadu 解决方案

标签: java json http-get rest-assured


【解决方案1】:

org.json 库易于使用。示例代码如下:

JSONObject completeJSON= new JSONObject(" ..YOUR JSON String Goes Here.. ");
String grapes= completeJSON.getJSONObject("fruits").getString("grapes");//Level2
String available= completeJSON.getString("isAvailable"); //Level1

您可以通过如下修改代码来获取此详细信息:

public String sendGetMessageValue(String messageId) {
    Map<String, String> response = doInternalModuleApiGet(messageId, 200);
     String fruits = response.get("fruits.grapes");
 JSONObject fruitsJSON= new JSONObject(fruits );
fruitsJSON.getString("grapes");
    return response.get("fruits.grapes");
}

您可以从以下位置找到更多示例:Parse JSON in Java

Downloadable

【讨论】:

  • 您如何将其放入我当前的代码中?看起来很有帮助,谢谢
  • 是的,我按照你说的做了,看起来不错。一个最终的编译错误。它作为 map 返回 sendHttpGetRequestAndGetResponse(url, expectedStatus).as(Map.class);但是我们使用 String String fruits = response.get("fruits.grapes");
  • 错误是:JSONObject 中的 JSONObject() 不能应用于 (java.lang.String)。
  • 您已将上述 JSON 转换为 Map 并使用密钥从该 Map 访问数据。 Map 将完美地适用于任何 json 父对象中的一级​​数据。但是在需要二级数据的地方,您需要再向下解析一级并使用该 JSON 数据获取更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2017-12-02
  • 2017-12-06
相关资源
最近更新 更多