如何使用groovy获取精确的json节点实例?

时间:2018-01-18 12:43:30

标签: json groovy types

输入 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代码相同的类名。

  • 如何区分节点valueoneclick。从逻辑上讲,我希望value应为instance of String。但两者都返回ArrayList

  • 如何使用groovy在json中获取确切的节点类型。

更新1:

我不知道,可以这样做如下所示。我期望得到这个结果,

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

3 个答案:

答案 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)

在你的json中,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