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

如何用Groovy批量替换deploy.json中版本值1.0.2为2.6.5?

解决Groovy脚本批量替换JSON中所有版本值的问题

请问是否有简便方法通过Groovy脚本,将deploy.json文件中所有版本值从"1.0.2"替换为"2.6.5"?文件内容如下:

{ "versions": [ { "version": "1.0.2", "conf": "replian" }, { "version": "1.0.2", "conf": "hp" }, { "version": "1.0.2", "conf": "shutoff" }, { "version": "1.0.2", "conf": "spark" } ] }

我尝试了以下代码,但仅替换了第一个版本值:

import groovy.json.JsonBuilder 
import groovy.json.JsonSlurper 
def content = ''' { "versions": [ { "version": "1.0.2", "conf": "replian" }, { "version": "1.0.2", "conf": "hp" }, { "version": "1.0.2", "conf": "shutoff" }, { "version": "1.0.2", "conf": "spark" } ] }''' 
def slurped = new JsonSlurper().parseText(content) 
def builder = new JsonBuilder(slurped) 
builder.content.versions.find{it.version}.version = "2.6.5" 
println(builder.toPrettyString()) 

问题现象:仅第一个conf对应的版本被替换,例如:

{ "version": "2.6.5", "conf": "replian" }, { "version": "1.0.2", "conf": "hp" }, { "version": "1.0.2", "conf": "shutoff" }, { "version": "1.0.2", "conf": "spark" }

嘿,这个问题很常见!你代码里的find方法是关键问题——它只会返回数组中第一个匹配条件的元素,所以自然只修改了第一个对象的版本值。要批量替换所有符合条件的元素,我们需要遍历整个versions数组。

修正后的两种简洁实现

方式1:直接遍历修改原对象(最直观)

用each方法遍历数组里的每一项,检查版本值并替换:

import groovy.json.JsonBuilder 
import groovy.json.JsonSlurper 

// 如果是从文件读取,替换成 def content = new File('deploy.json').text
def content = ''' { "versions": [ { "version": "1.0.2", "conf": "replian" }, { "version": "1.0.2", "conf": "hp" }, { "version": "1.0.2", "conf": "shutoff" }, { "version": "1.0.2", "conf": "spark" } ] }''' 

def slurped = new JsonSlurper().parseText(content) 

// 遍历所有版本项,替换指定版本
slurped.versions.each { item ->
    if (item.version == "1.0.2") {
        item.version = "2.6.5"
    }
}

def builder = new JsonBuilder(slurped) 
println(builder.toPrettyString())

方式2:生成新数组(不修改原解析对象)

如果你希望保留原解析后的对象不变,可以用collect生成一个新的数组:

import groovy.json.JsonBuilder 
import groovy.json.JsonSlurper 

def content = ''' { "versions": [ { "version": "1.0.2", "conf": "replian" }, { "version": "1.0.2", "conf": "hp" }, { "version": "1.0.2", "conf": "shutoff" }, { "version": "1.0.2", "conf": "spark" } ] }''' 

def slurped = new JsonSlurper().parseText(content) 

// 生成更新后的版本数组
def updatedVersions = slurped.versions.collect { item ->
    // 匹配到目标版本就替换,否则保留原对象
    item.version == "1.0.2" ? item + [version: "2.6.5"] : item
}
// 替换原数组
slurped.versions = updatedVersions

def builder = new JsonBuilder(slurped) 
println(builder.toPrettyString())

运行效果

两种方法都会输出所有版本值被替换后的JSON:

{
    "versions": [
        {
            "version": "2.6.5",
            "conf": "replian"
        },
        {
            "version": "2.6.5",
            "conf": "hp"
        },
        {
            "version": "2.6.5",
            "conf": "shutoff"
        },
        {
            "version": "2.6.5",
            "conf": "spark"
        }
    ]
}

小提示

如果你的JSON是本地文件,只需要把content变量替换成文件读取代码即可:

def content = new File('deploy.json').text

内容的提问来源于stack exchange,提问作者itgeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:29:08