Получить JSON детей одного узла со случайным именем в Groovy

В Groovy (не Grails) я хочу получить цвет такого элемента:

{
    "8436": {
        "color": "red",
    }
}

Число "8436" является динамическим, но всегда есть только один.

Я не могу использовать JsonSlurper's json.8436.color синтаксис, потому что число будет жестко закодировано.

Как получить цвет?

3 ответа

Решение

Еще один вариант, учитывая:

def jsonStr = '''{
    "8436": {
        "color": "red",
    }
}'''

Вы могли бы сделать:

import groovy.json.JsonSlurper

def json = new JsonSlurper().parseText(jsonStr)

def (rootKey, color) = json.findResult { k, v -> [k, v.color] }

assert rootKey == '8436'
assert color == 'red'

Поскольку вы немного знакомы со структурой ввода json, вы можете воспользоваться тем, что корнем является карта, содержащая один ключ.

Как это:

import groovy.json.JsonSlurper
def json = new JsonSlurper().parseText('{"8436":{"color":"red"}}')
def rootKey = json.keySet()[0]
assert rootKey == '8436'
assert json[rootKey].color == 'red'

Обновление: лучший (более идиоматический?) Способ

import groovy.json.JsonSlurper

def jsonStr = """
{
    "8436": {
        "color": "red",
    }
}
"""
def json = new JsonSlurper().parseText(jsonStr)

def color = json.each {}.collect{it.value.color}[0]

println color

======= старая версия, хранящаяся во внешней переменной-закрытии =======

Почему не как то так

import groovy.json.JsonSlurper

def jsonStr = """
{
    "8436": {
        "color": "red",
    }
}
"""
def json = new JsonSlurper().parseText(jsonStr)

def color
json.each { color = it.value.color}

println color
Другие вопросы по тегам