<>使用Groovy遍历解析嵌套json
*
Groovy使用JsonSlurper解析json时,不用区分是{}对象型,还是[]数组型,或者是两者混合,直接解析就可以获取到json相关的key或value。
* 遍历嵌套json方法:
//如果不知道json的key,value名称,可以使用.each结合groovy闭包进行遍历。
<>遍历多层嵌套json 例子一:
import groovy.json.JsonSlurper def json = '''{ "upperlevel1": { "lowerlevel1":
"ABC", "lowerlevel2": "DEF" }, "upperlevel2": { "lowerlevel1": "HIJ",
"lowerlevel2": "KLM" }, "dddd":{ "hello": "world" } }''' //解析demo1: def slurped
= new JsonSlurper().parseText(json) slurped.each{ key, value -> //遍历json第一层
println "${key}" //println "${value}" value.each {k, v -> //遍历json第二次 println
"${k}" //println "${value}" } } //*注意:在进行json第二层遍历的时候,必须要用第一层的 value 去进行第二层的key
value遍历。依此类推。 //解析demo2: def slurped = new JsonSlurper().parseText(json)
slurped.each{ key, value -> //遍历第一层的key:value // println "${key}" //输出第一层的key值
// println "${value}" //输出第一层的value值 value.each {k, v -> //遍历第二层的k:v // println
"${k}" //输出第二层的k值 // if(k.contains('it')) //如果第二层的 k值 包含某个字符,则输出 // { //
println "${v}" //输出这个字符串自己的 v 值 // println "${k}" //输出这个字符串自己的 v 值 // }
if(v.contains('related to')) //如果第二层的 v值 包含某个字符,则输出 { // println "${v}"
//如果第二层的 v 包含某个字符,则输出 v 自己的名字。 println "${value}" //如果第二层的 v 包含某个字符,则输出第二层
v为‘related to’的同级的所有k:v值。 } } }
<>遍历多层嵌套json 例子二:
def jsonText = """ { "Application1": { "environments": { "it": [ "server1" ],
"ft": [ "server2" ], "stg": [ "server3" ], "prd": [ "server4" ],
"relationship": [ "related to" ] }, "war-path" : "/opt/tomcat/", "war-name" :
"Application1" }, "Application2": { "environments": { "it": [ "serverA" ],
"ft": [ "serverB" ], "stg": [ "serverC" ], "prd": [ "serverD" ],
"relationship": [ "related to" ] }, "war-path" : "/var/lib", "war-name" :
"Application2" } } """ //解析demo: import groovy.json.JsonSlurper def jsonSlurper
= new JsonSlurper() def jsonMap = jsonSlurper.parseText(jsonText)
//如果不知道条目名称,则可以使用.each进行遍历 jsonMap.each { key, value -> //遍历第一层的key:value
value.environments.each { k, v -> //可以指定value(该value下仍有好几层的话)的某一个字段去遍历第二层的k:v
// if(k.contains('it')) //如果第二层的 k值 包含某个字符,则输出这个字符自己的k值 // { // println "${k}"
// } if(v.contains('related to')) { // println "${k}" //如果第二层的 v值
包含某个字符,则输出这个字符的k值 println "${value}" //如果第二层的 v 包含某个字符,则输出第二层 v为‘related
to’的同级的所有k:v。 } } }