Получить 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