如何在 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 文本)。第一个映射中的键是 name
和 address
。 name
的值是一个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
输出上设置一个调试点,以了解它返回的内容。
变量 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 文本)。第一个映射中的键是 name
和 address
。 name
的值是一个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
输出上设置一个调试点,以了解它返回的内容。