Как получить значение динамического ключа в 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.


person saara    schedule 22.09.2019    source источник


Ответы (1)


Карта, возвращенная из 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
comment
stackoverflow.com/users/1371329/jaco0646 Большое спасибо, чувак. Я потратил много часов, чтобы найти ответ. Наконец-то ты и мне помог. правда спасибо дружище - person saara; 23.09.2019