【问题标题】:Get JSON children of single node with random name in Groovy在 Groovy 中获取具有随机名称的单个节点的 JSON 子节点
【发布时间】:2016-09-28 12:00:06
【问题描述】:

在 Groovy(不是 Grails)中,我想获得这样一个项目的颜色:

{
    "8436": {
        "color": "red",
    }
}

“8436”号码是动态的,但始终只有一个。

我不能使用 JsonSlurper 的 json.8436.color 语法,因为数字会被硬编码。

如何获取颜色?

【问题讨论】:

    标签: json groovy jsonslurper


    【解决方案1】:

    另一个选项,给定:

    def jsonStr = '''{
        "8436": {
            "color": "red",
        }
    }'''
    

    你可以这样做:

    import groovy.json.JsonSlurper
    
    def json = new JsonSlurper().parseText(jsonStr)
    
    def (rootKey, color) = json.findResult { k, v -> [k, v.color] }
    
    assert rootKey == '8436'
    assert color == 'red'
    

    【讨论】:

      【解决方案2】:

      由于您对 json 输入的结构有所了解,因此您可以利用根是包含一个键的映射这一事实。

      像这样:

      import groovy.json.JsonSlurper
      def json = new JsonSlurper().parseText('{"8436":{"color":"red"}}')
      def rootKey = json.keySet()[0]
      assert rootKey == '8436'
      assert json[rootKey].color == 'red'
      

      【讨论】:

      • 获取 rootKey 确实是伟大的第一步!不幸的是,当我将您的代码放入文件并运行它时,我得到No signature of method: java.util.HashMap$KeySet.getAt() is applicable for argument types: (java.lang.Integer) values: [0]
      • 这个错误的几个解决方案浮现在脑海中:(1)从集合的迭代器中选择第一项:json.keySet().iterator().next(),(2)像以前一样将集合强制为列表和索引: (json.keySet() as List)[0], (3) 从一个空列表开始,然后将集合添加到它,然后像以前一样索引:`([] + json.keySet())[0],等等,主题有很多变化。
      • 顺便说一句,Iterable.getAt(int) 是在 Groovy 中定义的,所以我无法想象为什么 java.util.HashMap$KeySet 无法识别它,因为该类实现了 Iterable(顺便说一下,Collection Set)。在我看来,这似乎是 Groovy 中的一个错误,但我之前一直错在这。
      • @NicolasRaoul 我在提交之前在 groovy 控制台中运行了代码,也许我们正在使用不同的 groovy 版本(我在 2.4.7 上)?不确定何时在迭代器上添加了 getAt()。但是,BalRog 的建议:keySet().iterator().next() 应该适用于任何 groovy 版本。
      • 我正在使用 Ubuntu 2016.04 的 Groovy,它非常老:1.8.6
      【解决方案3】:

      更新:更好(更惯用的?)方式

      import groovy.json.JsonSlurper
      
      def jsonStr = """
      {
          "8436": {
              "color": "red",
          }
      }
      """
      def json = new JsonSlurper().parseText(jsonStr)
      
      def color = json.each {}.collect{it.value.color}[0]
      
      println color
      

      ======= 旧版本,存储在闭包外部变量中 =======

      为什么不这样:

      import groovy.json.JsonSlurper
      
      def jsonStr = """
      {
          "8436": {
              "color": "red",
          }
      }
      """
      def json = new JsonSlurper().parseText(jsonStr)
      
      def color
      json.each { color = it.value.color}
      
      println color
      

      【讨论】:

      • 我从不喜欢从闭包内部更改闭包外部的值:-/
      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 2015-06-20
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2020-08-30
      相关资源
      最近更新 更多