输入 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
下面,
带有String和List的json节点返回与上面显示的groovy代码相同的类名。
如何区分节点value
和oneclick
。从逻辑上讲,我希望value
应为instance of String
。但两者都返回ArrayList
。
如何使用groovy在json中获取确切的节点类型。
更新1:
我不知道,可以这样做如下所示。我期望得到这个结果,
New
class java.util.String
[CreateNewDoc(), hai]
class java.util.ArrayList
答案 0 :(得分:2)
你走了:
menuitem
列表中的每个地图。def printDetails = { key, value -> println "Key - $key, its value is \"${value}\" and is of typpe ${value.class}" }
def showMap = { map -> map.collect { k, v -> printDetails (k,v) } }
def json = new groovy.json.JsonSlurper().parse(new File('/tmp/test.json'))
def mItem = json.menu.popup.menuitem
if (mItem instanceof List) {
mItem.collect { showMap it }
}
println 'done'
您可以在线快速尝试 demo
答案 1 :(得分:1)
menuitem 是列表,因此您需要获取具体列表元素的属性:
assert newjson.menu.popup.menuitem instanceof List
assert newjson.menu.popup.menuitem[0].value instanceof String
assert newjson.menu.popup.menuitem[0].onclick instanceof List
答案 2 :(得分:1)
menuitem
包含一个对象的数组:
"menuitem": [
{
"value": "New",
"onclick": ["CreateNewDoc()","hai"],
"newnode":"added"
}
]
当您尝试访问menuitem.value
groovy时,实际上会返回value
数组中所有对象的menuitem
属性列表。
这就是menuitem.value
返回数组["New"]
在这种情况下
"menuitem": [
{
"value": "New",
"onclick": ["CreateNewDoc()","hai"],
"newnode":"added"
},
{
"value": "Old",
"onclick": ["CreateOldDoc()","hai"],
"newnode":"added"
}
]
menuitem.value
将返回数组["New", "Old"]
但menuitem[0].value
将返回字符串值"New"
所以在你的groovy代码中获取第一个菜单项的属性:
def value=newjson.menu.popup.menuitem[0].value
def oneclick=newjson.menu.popup.menuitem[0].onclick