遍历数组列表后,如何提取cvss_score对应的value值?
问题描述
我有如下JSON结构:
{ "tags":[ { "key":"category", "value":"Generic Secret" }, { "key":"category", "value":"Secret" }, { "key":"cvss_31_severity_rating", "value":"none" }, { "key":"cvss_score", "value":"0" }, { "key":"language", "value":"javascript" }, { "key":"owasp_category", "value":"a3-sensitive-data-exposure" }, { "key":"sink_method", "value":"src/auth/auth.controller.ts::program:validateWithX5UJwt" }, { "key":"source_method", "value":"src/auth/auth.controller.ts::program:validateWithX5UJwt" } ] }
我用以下Java代码遍历tags数组:
List<String[]> list = response.getBody().jsonPath().getList("response.findings.tags"); for (int k = 0; k < list.size(); k++) { System.out.println(list.get(k)); }
输出结果为:
[{key=category, value=Generic Secret}, {key=category, value=Secret}, {key=cvss_31_severity_rating, value=none}, {key=cvss_score, value=0}, {key=language, value=javascript}, {key=owasp_category, value=a3-sensitive-data-exposure}, {key=sink_method, value=src/auth/auth.controller.ts::program:validateWithJKUJwt}, {key=source_method, value=src/auth/auth.controller.ts::program:validateWithJKUJwt}]
现在需要提取key为cvss_score对应的value值(此例中为0),该如何实现?
解决方案
方案一:直接使用JsonPath过滤提取(推荐)
JsonPath支持通过条件过滤直接定位目标数据,无需遍历整个列表,代码更简洁高效:
// 直接提取cvss_score对应的value值 String cvssScore = response.getBody().jsonPath().getString("response.findings.tags[?(@.key == 'cvss_score')].value"); System.out.println(cvssScore); // 输出结果:0
如果需要将结果转为整数类型,可额外处理:
int cvssScoreInt = Integer.parseInt(cvssScore);
方案二:遍历列表提取
注意原代码中List<String[]>的类型声明有误(每个tag是键值对对象,而非字符串数组),应改为List<Map<String, String>>,然后遍历判断key匹配:
// 正确接收tags列表,每个元素是存储键值对的Map List<Map<String, String>> tagsList = response.getBody().jsonPath().getList("response.findings.tags", Map.class); for (Map<String, String> tag : tagsList) { if ("cvss_score".equals(tag.get("key"))) { String cvssScore = tag.get("value"); System.out.println(cvssScore); // 输出结果:0 break; // 找到目标后跳出循环,提升效率 } }
内容的提问来源于stack exchange,提问作者Manan Girdhar
相关产品推荐
相关产品推荐

