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

