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

如何在Groovy JSONSlurper中获取动态键的值?,groovy,groovyshell,Groovy,Groovyshell,变量resp包含以下JSON响应- {"name":"sample","address":{"country":"IN","state":"TN","city":"Chennai"}} 我计划使用param1变量从JSON响应中获取所需的密钥,但无法获得预期的结果 我正在传递类似-address.state的param1字段 def actValToGet(param1){ JsonSlurper slurper = new JsonSlurper(); def values

变量
resp
包含以下JSON响应-

{"name":"sample","address":{"country":"IN","state":"TN","city":"Chennai"}} 
我计划使用
param1
变量从JSON响应中获取所需的密钥,但无法获得预期的结果

我正在传递类似-address.state的
param1
字段

def actValToGet(param1){
    JsonSlurper slurper = new JsonSlurper();
    def values = slurper.parseText(resp)
    return values.param1 //values.address.state
}
我在这里得到
NULL
值->
值。param1


谁能帮帮我吗。我是Groovy新手。

JsonSlurper
返回的映射是嵌套的,而不是平面的。换句话说,它是一个映射的映射(完全镜像解析的Json文本)。第一个映射中的键是
名称
地址
name
的值是一个字符串;
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
上设置一个调试点,以了解它返回的内容。

非常感谢。我花了很多时间来寻找答案。最后你的老师帮助了我。真的谢谢你,伙计