如何在不使用父键或迭代的情况下获取子键

时间:2017-03-07 18:45:59

标签: groovy

1.我有一个包含多个地图的列表,如下图所示。     每个地图都包含许多我想要获得“名称”值的键

    {
       "question":{
          "com.forms.tree":{
             "requiredByDefault":true,
             "questionDetails":{
                "com.forms.Details":{
                   "preferredFormComponent":"TEXT"
                }
             },
             "locale":{
                "language":"en"
             },
             "formField":{
                "name":"CUSTOM_347",
                "tag":"input",
                "url":"Demo"
             }
          }
       },
       "Field":"true"
    },{
   "question":{
      "com.forms.tree":{
         "questionDetails":{
            "com.forms.Details":{
               "preferredFormComponent":"TEXT"
            }
         },
         "locale":{
            "language":"en"
         },
         "formField":{
            "name":"CUSTOM_348",
            "url":"Demo"
         }
      }
   },
   "Field":"true"}

我希望获得“name”的值,该值位于每个Map中但不想像question?."com.forms.tree"?.formField?.name那样迭代。

Is there any other approach in groovy?

1 个答案:

答案 0 :(得分:1)

所以给了json:

dt[,DataField,by=FilterField]'

我们可以用以下方法解析它:

def jsonTxt = '''{
   "question":{
      "com.forms.tree":{
         "requiredByDefault":true,
         "questionDetails":{
            "com.forms.Details":{
               "preferredFormComponent":"TEXT"
            }
         },
         "locale":{
            "name": "test",
            "language":"en"
         },
         "formField":{
            "name":"CUSTOM_347",
            "tag":"input",
            "url":"Demo"
         }
      }
   },
   "Field":"true"
}'''

你想在那个对象中找到import groovy.json.* def json = new JsonSlurper().parseText(jsonTxt) 条目,所以让我们编写一个递归查找器,它将遍历地图的地图,寻找带有给定键的第一个条目:

"formField"

然后你可以检查它是否有效:

static findFirstByKey(Map map, key) {
    map.get(key) ?: map.findResult { k, v -> if(v in Map) findFirstByKey(v, key) }
}