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

Groovy使用JsonBuilder创建JSON结构时出现MissingMethodException报错

Groovy JsonBuilder构建时报错解决方案

问题根源

你遇到的报错本质是作用域变量名和JsonBuilder的DSL键名冲突。
在software闭包内写name name时,Groovy会优先解析当前上下文里的name变量(你定义的GString类型同名变量),而不是把左侧的name识别为JsonBuilder用来生成JSON键的方法调用。
Groovy语法中方法名 参数等价于方法名.call(参数),此时左侧的name已经被解析为String/GString类型的变量,该类型不存在call方法,因此抛出MissingMethodException。即使你将变量转为普通String,只要变量名和键名重复,冲突就不会消失,报错会持续存在。

解决方案

以下三种方案任选其一即可:

  • 方案1:修改变量名避免冲突
    将你的变量名从name/version改为和JSON键名不重复的命名,比如softName/softVersion,修改后直接使用DSL语法即可正常运行:
def builder = new JsonBuilder()

builder.configuration {
    software {
        name softName
        version softVersion
        description "description"
    }
    git {
        name "appName"
        repository "repo"
        branch "branch"
    }
}
  • 方案2:使用显式赋值语法
    直接用键 = 值的写法,Groovy就不会将左侧的键名解析为上下文中的变量:
def builder = new JsonBuilder()

builder.configuration {
    software {
        this.name = name
        this.version = version
        description = "description"
    }
    git {
        name = "appName"
        repository = "repo"
        branch = "branch"
    }
}
  • 方案3:通过delegate明确调用构建器方法
    JsonBuilder闭包的delegate指向当前构建器实例,显式指定调用方即可避开作用域变量干扰:
def builder = new JsonBuilder()

builder.configuration {
    software {
        delegate.name name
        delegate.version version
        delegate.description "description"
    }
    git {
        delegate.name "appName"
        delegate.repository "repo"
        delegate.branch "branch"
    }
}

内容的提问来源于stack exchange,提问作者Evil Washing Machine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:15:04