【问题标题】:REST ASSURED (JAVA): Extract json object value given it's parent object valueREST ASSURED (JAVA):提取 json 对象值给定它的父对象值
【发布时间】:2019-10-07 18:54:40
【问题描述】:

假设我有以下 json:

{
  "page": 2,
  "per_page": 3,
  "total": 12,
  "total_pages": 4,
  "data": [
 {
    "id": 4,
    "first_name": "Eve",
    "last_name": "Holt",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"
},
{
    "id": 5,
    "first_name": "Charles",
    "last_name": "Morris",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg"
},
{
    "id": 6,
    "first_name": "Tracey",
    "last_name": "Ramos",
    "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"
}]}

我只想提取属于 id = 6 的“first_name”的值。

我可以用其他方法来克服这个问题,但我想知道是否有直接的方法让你放心

到目前为止我已经尝试过的一些事情: data.find { it.id == '6' }.first_name

有可能吗?如果是真的,该怎么做? 谢谢。

【问题讨论】:

  • 如果可能的话。你有没有尝试过自己这样做?
  • 当然。没有成功。我可以用其他方法来克服这个问题,但我想知道是否有直接的方法让我放心。
  • 请展示您的尝试。
  • data.find { it.id == '6' }.first_name
  • 请使用该信息编辑您的问题。 SO 的一部分礼仪是展示你的工作并提出完整的独立问题。请不要将我的 cmets 视为帮助您改进问题的尝试。

标签: java json rest-assured rest-assured-jsonpath


【解决方案1】:

在JsonPath下面使用,它会根据id给你first_name:

[?(@.id ==4)].first_name

【讨论】:

    【解决方案2】:

    我不确定此解决方案是否是您要寻找的解决方案,但您绝对可以根据 id 提取名字。

    Rest Assured 中使用JsonPath 库。您可以将 JSON 作为字符串 JsonPath.from("json string") 传递,也可以从 Response 获取它,如下所示:

    JsonPath path = response.jsonPath();
    

    然后,您可以获得data 数组并像这样遍历其元素:

        List<HashMap<String, Object>> data = path.getList("data");
        for (HashMap<String, Object> singleObject : data) {
            if (singleObject.get("id").equals(6)) {
                System.out.println(singleObject.get("first_name"));
            }
        }
    

    上面将打印名称“Tracey”到控制台。 您可以使用此代码或创建一个方法来根据 id 返回参数,如下所示:

        private static String getFirstNameById(JsonPath path, int id) {
            List<HashMap<String, Object>> data = path.getList("data");
            for (HashMap<String, Object> singleObject : data) {
                if (singleObject.get("id").equals(id)) {
                    return (String) singleObject.get("first_name");
                }
            }
            throw new NoSuchElementException(String.format("Can't find first_name with id: %d", id));
        }
    

    只是为了确保您理解 - data 数组中的每个元素都是 JSON 对象。我们使用方法getList 收集所有对象。每个对象都由StringObjectHashMap 表示,因为它包含不同的类型。 first_name 是字符串,id 是整数,这就是为什么我们必须使用 Objects 的 HashMap 作为第二个通用参数。

    然后我们遍历 HashMap,比较每个 JSON 对象的id 以获得所需的结果。

    如果您愿意,也可以使用Java Stream。同样的方法看起来像这样:

    List<HashMap<String, Object>> data = JsonPath.from(json).getList("data");
    Optional<String> firstName = data.stream().filter(x -> x.get("id").equals(6)).map(x -> (String) x.get("first_name")).findFirst();
    if (firstName.isPresent()) {
        System.out.println(firstName.get());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 2017-08-08
      • 2021-03-16
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多