Карта, возвращенная из JsonSlurper
, является вложенной, а не плоской. Другими словами, это карта карт (точно отражающая текст Json, который был проанализирован). Ключи на первой карте — name
и address
. Значение 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
}
}
Более функциональный подход может заменить изменяемую переменную 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()
, чтобы понять, что он возвращает.
person
jaco0646
schedule
22.09.2019