Как получить значение динамического ключа в Groovy JSONSlurper? - PullRequest
0 голосов
/ 22 сентября 2019

Переменная 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 голосов
/ 23 сентября 2019

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

...