Карта, возвращаемая из 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()
, чтобы понять, что он возвращает.