You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:35:21