将JSON转换为Gpath结果

时间:2018-09-08 18:11:34

标签: json groovy

我想将所有JSON键值转换为Map。我需要将键作为gpath结果并将值作为对象键值。

输入Json

 {
    "employees": {
        "employee": [{
                "id": "1",
                "firstName": "Tom",
                "lastName": "Cruise",
                "photo": "https://pbs.twimg.com/profile_images/735509975649378305/B81JwLT7.jpg"
            },
            {
                "id": "2",
                "firstName": "Maria",
                "lastName": "Sharapova",
                "photo": "https://pbs.twimg.com/profile_images/3424509849/bfa1b9121afc39d1dcdb53cfc423bf12.jpeg"
            },
            {
                "id": "3",
                "firstName": "James",
                "lastName": "Bond",
                "photo": "https://pbs.twimg.com/profile_images/664886718559076352/M00cOLrh.jpg"
            }
        ]
    }
 }

我期望的输出,

[employees.employee[0].id:"1",
employees.employee[0].firstName:"tom",
....]

我尝试了Groovy jsonSurper()对象类,但找不到将所有键映射到gpath的解决方案。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

有点奇怪的请求...想不起来为什么要这么做...但是无论如何,您都需要编写一些逻辑来遍历JsonSlurper生成的地图,并折叠键...

假设您上面的json位于字符串变量json中:

def map = new JsonSlurper().parseText(json)

def collapseKey(String prefix, Map result, value) {
    if (value instanceof Map) {
        value.each { k, v ->
            collapseKey("${prefix ? "${prefix}." : ''}$k", result, v)
        }
    } else if (value instanceof List) {
        value.eachWithIndex{ e, idx ->
            collapseKey("${prefix}[$idx]", result, e)
        }
    } else {
        result."$prefix" = value
    }
    result
}

def result = collapseKey("", [:], map)

您可以(当然)可以将其解析为地图并执行以下操作:

map.employees.employee[0].firstName