7

I am writing a Grails/Groovy app and I have a JSON object with a "string" name (grommet and widget) inside the params member that can change. That is, next time it might be acme and zoom. Here is the JSON:

def jx = """{ 
    "job": "42",
    "params": {
        "grommet": {"name": "x", "data": "y"},
        "widget": { "name": "a", "data": "b"}
    } 
}"""

I am trying to figure out how to get the string grommet . Code so far:

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

Any idea how to get the string grommet? Iama going to keep hitting my head against a wall.

4

3 回答 3

9

JSON 对象上的params键与 JSON 对象相关联,而不是数组,因此您无法通过索引访问它。JsonSlurper 将 JSON 对象映射到 Groovy Maps,因此您可以params通过它的键进行访问,这些键是字符串,例如dalist.params.grommet,它将为您提供映射[name: 'x', data: 'y']

要访问params你可以做的钥匙dalist.params.keySet(),这会给你的清单['grommet', 'widget']。如果您只对知道params密钥感兴趣,那应该可以解决问题。如果您出于某种原因需要获取'grommet'字符串,您可以通过访问该列表中的第一个元素 ie 来dalist.params.keySet()[0]完成,但我不知道您为什么想知道这一点。而且我不确定是否可以保证该映射的第一个键始终是'grommet',因为 JSON 对象未按规范排序(来自json.org对象是一组无序的名称/值对),但是,反过来,Groovy 映射有序(默认实现是 LinkedHashMap)...所以我会假设在将 JSON 解析到 Groovy 世界时会保留该顺序,但我会尽量不依赖该特定行为呵呵。

于 2012-06-16T05:19:00.600 回答
4

这是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
于 2012-06-16T05:16:30.550 回答
2

这可能会帮助你。

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
于 2012-06-16T05:34:51.187 回答