我正在编写一个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不停地撞在墙上。
答案 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