所以我一直坚持这个问题很长一段时间了。
我正在处理以JSON提供的一些数据,并使用groovy通过WSLITE检索。 到目前为止,处理json结构并查找数据是没有问题的,因为WSLITE提供了webservice响应 被重新调整为JsonSlurper的一个实例。 我现在遇到了一些情况,其中json响应的结构根据我查询的内容而变化。
结构如下:
{
"result":[
...
"someId": [...]
"somethingElse": [...]
...
"variants":{
"0123":{
"description": "somethingsomething",
...,
...,
"subVariant":{
"1234001":{
name: "somename",
...
}
}
},
"4567":{
"description": "somethingsomething",
...,
...,
"subVariant":{
"4567001":{
name: "somename"
...
...
}
}
}
}
]
}
如您所见,variants节点是一个包含另一个嵌套对象的对象,该对象包含更多嵌套对象。 这里的问题是,变体节点有时会持有多个OBJECT,但总是至少有一个。与subVariant节点相同。 此外,我现在不提前(数字)节点的名称。因此,我必须以恐怖的方式建立这条道路。
由于Json在groovy中作为地图,列表和数组处理,我认为我能够做到这一点:
def js = JsonSlurper().parseText(jsonReponse)
println js.result.variants[0].subVariant[0].name //js.result.variants.getClass() prints class java.util.ArrayList
但返回null
以静态方式访问数据:
println "js.result.variants."0123".subVariant."1234001".name
works just fine.
只需将这些变体设为
println js.result.variants
也可以。它打印整个变体树的第一个(也是唯一的)内容。
我的问题是:为什么?
有点似乎我无法通过索引来解决被关联的对象...我是对的吗?我怎么会这样呢?
提前谢谢。答案 0 :(得分:0)
您使用[0]
无法访问它的原因只是因为"variants": { ...
不是数组,如下所示:"variants" :[ ...
所以你的variants
是一个具有可变数量属性的对象,它基本上是一个命名的地图。
但是,如果您不知道条目名称,可以使用.each
进行迭代,这样您就可以执行js.result.variants.each{key, val -> println val.description}
与子变量相似的东西