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

