如何用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
相关产品推荐
相关产品推荐

