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