如何在 Groovy JSONSlurper 中获取动态键的值?

How to get a value of a dynamic key in Groovy JSONSlurper?

变量 resp 包含以下 JSON 响应 -

{"name":"sample","address":{"country":"IN","state":"TN","city":"Chennai"}} 

我计划使用 param1 变量从 JSON 响应中获取所需的密钥,但我无法获得预期的结果。

我正在传递 param1 字段,例如 - address.state

def actValToGet(param1){
    JsonSlurper slurper = new JsonSlurper();
    def values = slurper.parseText(resp)
    return values.param1 //values.address.state
}

我在这里得到 NULL 值 -> values.param1

谁能帮帮我。我是 Groovy.

的新手

JsonSlurper 返回的地图是嵌套的而不是平面的。换句话说,它是地图的地图(完全反映了已解析的 Json 文本)。第一个映射中的键是 nameaddressname的值是一个String; address 的值是另一个映射,还有三个键。

为了解析出嵌套键的值,您必须遍历每一层。这是一个显示正在发生的事情的程序解决方案。

class Main {
    static void main(String... args) {
        def resp = '{"name":"sample","address":{"country":"IN","state":"TN","city":"Chennai"}}'
        println actValToGet(resp, 'address.state')
    }

    static actValToGet(String resp, String params){
        JsonSlurper slurper = new JsonSlurper()
        def values = slurper.parseText(resp)
        def keys = params.split(/\./)
        def output = values
        keys.each { output = output.get(it) }
        return output
    }
}

更实用的方法可能会用 inject() 方法替换可变 output 变量。

    static actValToGet2(String resp, String params){
        JsonSlurper slurper = new JsonSlurper()
        def values = slurper.parseText(resp)
        def keys = params.split(/\./)
        return keys.inject(values) { map, key -> map.get(key) }
    }

为了证明 Groovy 有多简洁,我们可以在一行中完成。

    static actValToGet3(String resp, String params){
        params.split(/\./).inject(new JsonSlurper().parseText(resp)) { map, key -> map[key] }
    }

您可能想在 parseText() 方法的 values 输出上设置一个调试点,以了解它返回的内容。