【问题标题】:How to get the exact json node instance using groovy?如何使用 groovy 获取确切的 json 节点实例?
【发布时间】:2018-01-18 12:43:30
【问题描述】:

输入 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

【问题讨论】:

  • 它只是一个字符串和一个列表。 JSON 只能处理那些基本类型(以及 object、bool、nil、...)
  • @cfrick 我能得到上面更新 1 中显示的答案吗
  • 您正在从列表中获取值。您必须决定,是需要全部还是只需要第一个或最后一个等。

标签: json groovy types


【解决方案1】:

给你:

  • 在下面的脚本中使用闭包来显示每个值及其类型的详细信息
  • 另一个闭包用于显示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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      在您的 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"

      所以在你的常规代码中获取第一个菜单项的属性:

      def value=newjson.menu.popup.menuitem[0].value
      def oneclick=newjson.menu.popup.menuitem[0].onclick
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 2018-07-03
        • 1970-01-01
        • 2015-06-20
        相关资源
        最近更新 更多