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

如何使用Groovy获取JSON节点的准确实例类型?

如何在Groovy中获取JSON节点的准确类型?

问题背景

你遇到的问题是:用JsonSlurper解析JSON时,明明逻辑上value应该是String类型,但实际返回的却是ArrayList,和数组类型的onclick返回了相同的类型。

你的JSON结构:

{ "menu": { "id": "file", "value": "File", "popup": { "menuitem": [ { "value": "New", "onclick": ["CreateNewDoc()","hai"], "newnode":"added" } ] } }

使用的Groovy代码:

def newjson = new JsonSlurper().parse(new File ('/tmp/test.json'))
def value=newjson.menu.popup.menuitem.value
def oneclick=newjson.menu.popup.menuitem.onclick
println value
println value.class
println oneclick
println oneclick.class

实际输出:

[New]
class java.util.ArrayList
[[CreateNewDoc(), hai]]
class java.util.ArrayList

期望输出:

New
class java.lang.String
[CreateNewDoc(), hai]
class java.util.ArrayList

问题原因

问题出在menuitem本身是一个JSON数组(注意它外面的[])。当你直接调用newjson.menu.popup.menuitem.value时,Groovy会自动遍历这个数组里的所有元素,把每个元素的value字段值收集起来,返回一个新的ArrayList——这是Groovy对集合的便捷操作特性,但在这里不是你想要的行为。

解决办法

你需要先定位到数组中的具体元素(这里数组只有一个元素,所以取索引0),再访问该元素的字段,这样就能拿到字段的真实类型了:

修改后的代码:

def newjson = new JsonSlurper().parse(new File('/tmp/test.json'))
// 先获取menuitem数组的第一个元素
def singleMenuItem = newjson.menu.popup.menuitem[0]
def value = singleMenuItem.value
def oneclick = singleMenuItem.onclick

println value
println value.class
println oneclick
println oneclick.class

运行这段代码后,就能得到你期望的输出:

New
class java.lang.String
[CreateNewDoc(), hai]
class java.util.ArrayList

额外提示

如果你的menuitem数组可能有多个元素,想要遍历每个元素并获取它们的字段类型,可以用循环处理:

newjson.menu.popup.menuitem.each { item ->
    println "value: ${item.value}, type: ${item.value.class}"
    println "onclick: ${item.onclick}, type: ${item.onclick.class}"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:35:54