JSON到Groovy与JsonSlurper和未知的“字符串”

时间:2012-06-16 04:52:17

标签: json grails groovy

我正在编写一个Grails / Groovy应用程序,我在参数中有一个带有“字符串”名称(索环小部件)的JSON对象可以改变的成员。也就是说,下次可能是极致缩放。这是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

知道如何获取字符串索环吗? Iama不停地撞在墙上。

3 个答案:

答案 0 :(得分:9)

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

要访问params上的密钥,您可以执行dalist.params.keySet(),这会为您提供列表['grommet', 'widget']。如果您只想知道params密钥,那就应该这样做。如果由于某种原因需要获取'grommet'字符串,可以通过访问该列表中的第一个元素(即dalist.params.keySet()[0])来完成,但我不知道您为什么要知道这一点。而且我不确定是否可以保证该地图的第一个键始终为'grommet',因为JSON对象与规范无关(来自json.org对象是无序的一组名称/值对),但反过来,Groovy映射有序的(默认实现是LinkedHashMap)...所以我会假设在解析JSON时保留顺序对于Groovy世界,但我尽量不依赖于那种特殊的行为。

答案 1 :(得分: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

答案 2 :(得分: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