【问题标题】:Groovy Mapping : Get all the values of a columnGroovy 映射:获取列的所有值
【发布时间】:2022-01-06 07:19:21
【问题描述】:

我有一个如下的 json,我正在尝试使用 Groovy 获取所有“开发”主机的列表。 我怎样才能做到这一点 ?我附上了我目前正在使用的示例代码,但由于明显的原因它不起作用。我是 Groovy 的新手。

{
  "app1": {
    "dev": [
      "host1",
      "host2"
    ],
    "qa": null,
    "uat": [
      "host11"
    ]
  },
  "app2": {
    "qa": null,
    "stable": null,
    "dev": [
      "host3",
      "host4"
    ]
}

代码:

apiResponse = <Code which returns the json as mentioned above>
def parser = new JsonSlurper()
def host_list = parser.parseText(apiResponse)

dev_hosts = host_list[]['dev']

print dev_hosts

预期结果:

['host1','host2','host3','host4']

【问题讨论】:

    标签: groovy mapping


    【解决方案1】:

    有很多方法可以做到这一点,最好的方法可能取决于了解更多关于顶级 JSON 文档中有多少对象等的常见使用模式,但以下方法确实起作用:

    String jsonInput = """
    {
    "app1": {
        "dev": [
            "host1",
            "host2"
        ],
        "qa": null,
        "uat": [
            "host11"
        ]
      },
      "app2": {
          "qa": null,
              "stable": null,
              "dev": [
                "host3",
                "host4"
            ]
        }
    }"""
    
    def object = new JsonSlurper().parseText(jsonInput)
    def results = object.collect { it.value.dev }.flatten()
    
    assert results == ['host1', 'host2', 'host3', 'host4']
    

    【讨论】:

      【解决方案2】:
      def dev_hosts = host_list.values().collectMany{it['dev']}
      

      编辑:OP 调整了规格:dev 应该是一个变量并且列表 需要展平(大概在第一级)。

      【讨论】:

      • 如何将'dev'作为参数传递给命令?
      • @SujeetPadhi 答案已更新为新规范
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2011-01-01
      相关资源
      最近更新 更多