如何使用 Gatling 中的 jsonpath 表达式从 json 中提取正确的 id

how to extract correct id from json with jsonpath Expression in Gatling

我正在使用 Gatling 测试 API,我必须从 JSON 中提取 ID 并将其存储在变量中,但 Gatling 不支持此操作:"$.[?(@.name == 'manage-account')].id" 如何找到属于 'manage-account' 的 ID?

JSON 看起来像这样:

    {
  "realmRoles" : [ {
    "id" : "2253a9b4-bc1e",
    "name" : "offline_access",
    "description" : "${role_offline-access}",
    "composite" : false,
    "clientRole" : false,
    "containerId" : "sp"
  }, {
    "id" : "313d800c",
    "name" : "ua_authorization",
    "description" : "${role_ua_authorization}",
    "composite" : false,
    "clientRole" : false,
    "containerId" : "sp"
  } ],
  "clientRoles" : [ {
    "client" : {
      "id" : "37e4837b-8e77",
      "name" : "account"
    },
    "roles" : [ {
      "id" : "48abb872-dc25",
      "name" : "manage-account-links",
      "description" : "${role_manage-account-links}",
      "composite" : false,
      "clientRole" : true,
      "containerId" : "37e4837b-8e77e"
    }, {
      "id" : "a1fadc14-30c18",
      "name" : "manage-account",
      "description" : "${role_manage-account}",
      "composite" : true,
      "clientRole" : true,
      "containerId" : "37e4837b-8e77"
    } ]
  }, {
    "client" : {
      "id" : "ef80d8e9-5f9b",
      "name" : "realm-management"
    },
    "roles" : [ {
      "id" : "d1e35e29-b26e",
      "name" : "manage-users",
      "description" : "${role_manage-users}",
      "composite" : false,
      "clientRole" : true,
      "containerId" : "ef80d8e9-5f93"
    } ]
  }]
  } ]
}

JsonPath 目前缺少适当的规范,因此语法解释因一种实现而异。

在这里,您应该使用 $..*[?(@.name == 'manage-account')].id:您想要递归下降 (..) 并匹配与您的过滤器匹配的任何节点 (*)。

如果您想不再受这些差异的困扰,我建议改用 JMESPath,请参阅我们的 blog。与 JsonPath 相比,JMESPath 主要缺乏的是递归下降,这很方便,但性能较差。您必须指定完整路径。