使用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。
}
}
}