通过Groovy中的嵌套Json访问和循环

时间:2016-08-15 10:18:11

标签: json groovy jsonobject jsonslurper

所以我一直坚持这个问题很长一段时间了。

我正在处理以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

也可以。它打印整个变体树的第一个(也是唯一的)内容。

我的问题是:为什么?

有点似乎我无法通过索引来解决被关联的对象...我是对的吗?我怎么会这样呢?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您使用[0]无法访问它的原因只是因为"variants": { ...不是数组,如下所示:"variants" :[ ...

所以你的variants是一个具有可变数量属性的对象,它基本上是一个命名的地图。 但是,如果您不知道条目名称,可以使用.each进行迭代,这样您就可以执行js.result.variants.each{key, val -> println val.description}

之类的操作

与子变量相似的东西