JSON для Groovy с jsonslurper и неизвестной "строкой"
Я пишу приложение Grails/Groovy, и у меня есть объект JSON с именем "string" (прокладка и виджет) внутри params член, который может измениться. То есть, в следующий раз это может быть acme и масштабирование. Вот JSON:
def jx = """{
"job": "42",
"params": {
"grommet": {"name": "x", "data": "y"},
"widget": { "name": "a", "data": "b"}
}
}"""
Я пытаюсь выяснить, как получить строку прокладка . Код пока:
def dalist = new JsonSlurper().parseText(jx)
println dalist.job // Gives: 42
println dalist.params // Gives: [grommet:[name:x, data:y], widget:[name:a, data:b]]
println dalist.params[0] // Gives: null
любая идея, как получить строку прокладка? Айама будет продолжать бить меня головой о стену.
3 ответов
на params
ключ на объекте JSON связан с объектом JSON, а не массивом, поэтому вы не можете получить к нему доступ по индексу. JsonSlurper сопоставляет объекты JSON с Groovy Maps, поэтому вы можете получить доступ к params
по его клавишам, которые являются строками, например dalist.params.grommet
, который даст вам карту [name: 'x', data: 'y']
.
для доступа к ключам на params
можно сделать dalist.params.keySet()
, который даст вам список ['grommet', 'widget']
. Если вам интересно просто знать params
ключи, это должно сделать трюк. Если вам нужно получить the 'grommet'
string по какой-то причине вы можете сделать это, обратившись к первому элементу в этом списке, т. е. dalist.params.keySet()[0]
, но я не знаю, почему вы хотите это знать. И я не уверен, что гарантируется, что первый ключ этой карты всегда будет 'grommet'
, поскольку объекты JSON неупорядочены спецификацией (от json.org:объект представляет собой неупорядоченный набор пар имя / значение), но, в свою очередь, Groovy maps are ordered (реализация по умолчанию LinkedHashMap)... поэтому я бы предположил, что порядок сохраняется при разборе JSON в Groovy world, но я бы постарался не полагаться на это конкретное поведение.
Это Map
например, попробовать:
def params = dalist.params.entrySet() as List // entrySet() returns Set, but it's easier to use it as a List
println params
println params.size()
println params[0]
println params[0].key
println params[0].value
Это может помочь вам.
import groovy.json.JsonSlurper;
def jx='{"job":"42","params":{"grommet":{"name":"x","data":"y"},"widget":{"name":"a","data":"b"}}}'
def dalist = new JsonSlurper().parseText( jx )
assert dalist.params.getClass().name == "java.util.HashMap";
assert dalist.params.size() == 2;
def keys = dalist.params.collect{ a, b -> a}; // returns "[grommet, widget]"
assert !!dalist.params.get( "grommet" ) == true