如何用Java实现的JSONPath合并数组并去重(Jenkins场景)
Jenkins中用Java/Groovy实现JSONPath合并数组并去重
你遇到的问题核心是不同JSONPath实现的语法差异:你用的$.append()是部分扩展JSONPath的函数,但Jenkins默认使用的Jayway JsonPath(Java生态常用)并不支持这个语法,所以在线测试工具(若基于不同实现)也会无结果。以下是适配Jenkins环境的解决方案:
步骤1:提取目标元素集合
使用JSONPath表达式同时提取added和removed数组的所有元素,语法为:
$..added[*],$..removed[*]
这个表达式会返回一个包含所有元素的列表(例如["deleteme/main.tf", "deleteme.txt"]),但如果有重复元素会保留重复项。
步骤2:通过代码实现去重与格式化
纯JSONPath语法无法直接完成去重(Jayway JsonPath不支持去重函数),需要结合Java/Groovy代码处理:
1. Java代码示例(适用于Jenkins自定义插件或Java类)
import com.jayway.jsonpath.JsonPath; import java.util.List; import java.util.Set; import java.util.Arrays; public class JsonMergeProcessor { public static void main(String[] args) { String json = "{\"commits\":[{\"author\":{\"name\":\"Christian\",\"email\":\"christian@company.com\"},\"added\":[\"deleteme/main.tf\"],\"modified\":[],\"removed\":[\"deleteme.txt\"]}]}"; // 提取所有目标元素 List<String> allElements = JsonPath.read(json, "$..added[*],$..removed[*]"); // 转Set自动去重 Set<String> uniqueElements = Set.copyOf(allElements); // 输出数组形式 String[] arrayOutput = uniqueElements.toArray(new String[0]); System.out.println("数组结果: " + Arrays.toString(arrayOutput)); // 输出逗号分隔字符串 String stringOutput = String.join(", ", uniqueElements); System.out.println("字符串结果: " + stringOutput); } }
2. Jenkins Pipeline Groovy脚本示例
直接在Jenkins流水线中使用:
def commitJson = '''{ "commits": [ { "author": { "name": "Christian", "email": "christian@company.com" }, "added": ["deleteme/main.tf"], "modified": [], "removed": ["deleteme.txt"] } ] }''' // 提取元素 def allItems = JsonPath.read(commitJson, '$..added[*],$..removed[*]') // 去重 def uniqueItems = allItems.toSet() // 转逗号分隔字符串 def resultStr = uniqueItems.join(', ') echo "合并去重结果: ${resultStr}"
关键说明
- Jayway JsonPath是Java/JVM生态(包括Jenkins)的主流JSONPath实现,不支持
append()这类扩展函数,需通过代码逻辑补充。 - 若你的Jenkins环境未预装JsonPath依赖,需在Pipeline中先引入:
@Grab('com.jayway.jsonpath:json-path:2.8.0')
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

