-1

所以我已经被这个问题困扰了很长一段时间了。

我正在处理一些以 JSON 形式提供并使用 groovy通过WSLITE检索的数据。到目前为止,处理 json 结构和查找数据没有问题,因为 WSLITE 提供的 Web 服务响应被重新调整为 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

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

我的问题是:为什么会这样?

似乎我无法通过索引来处理下一个对象......我是对的吗?我该怎么办?

提前致谢。

4

1 回答 1

0

那么你不能使用它访问它的原因[0]仅仅是因为它"variants": { ...不是一个数组,它看起来像这样:"variants" :[ ...

所以你variants是一个具有可变数量属性的对象,它基本上是一个命名映射。但是,如果您不知道条目名称,则可以使用 遍历这些条目.each,因此您可以执行类似的操作js.result.variants.each{key, val -> println val.description}

子变体也有类似的东西

于 2016-08-15T11:49:25.717 回答