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

时间:2019-09-22 18:38:07

标签: groovy groovyshell

变量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的新手。

1 个答案:

答案 0 :(得分:0)

JsonSlurper返回的地图是嵌套而不是平坦的。换句话说,它是一个地图地图(完全反映了已解析的Json文本)。第一个映射中的键是nameaddressname的值是一个字符串; 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
    }
}

一种更具功能性的方法可能是用output方法替换可变的inject()变量。

    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] }
    }

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