2016-08-15 50 views
0

所以我一直坚持这个问题相当长一段时间了。Groovy访问和循环虽然嵌套Json

我正在处理一些以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" 
         ... 
         ... 
        } 
       } 
      } 
    } 
    ] 
} 

正如你所看到的,变体节点是一个对象保持保持更加嵌套对象另一个嵌套对象。 这里的问题是变体节点有时拥有多个对象,但总是至少有一个。相同vor subVariant节点。 此外,我现在不提前(数字)节点的名称。因此我不得不建立一条路径。

由于JSON地图,列表和数组在常规处理,我想我能做到这一点:

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. 

只是pinting变种这样

println js.result.variants 

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

我的问题是:为什么?

这似乎是我不能通过索引解决nexted对象......我是对吗?我还会怎么做呢?

在此先感谢。

回答

0

井原因,你就用[0]着访问很简单,因为"variants": { ...心不是一个数组,这将是这样的:"variants" :[ ...

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

而对于次级变形类似

+0

的东西是“js.result.variants.getClass ()'显示它确实是一个java.util.ArrayList –

+0

你可以把你准确的json吗?因为这看起来不是那样,因为你甚至有一些json错误(例如subvariant中的名字不在引号中) – OsaSoft