如何使用 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 主要缺乏的是递归下降,这很方便,但性能较差。您必须指定完整路径。
我正在使用 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 主要缺乏的是递归下降,这很方便,但性能较差。您必须指定完整路径。