我发了这个question in the Groovy mailing lists,但是我还没有得到回复。我想知道是否有人能帮上忙。我正在重新发布我的原始问题的相关文本。
我有一个嵌套的输入json,它是通过JsonSlurper读取的,并且一些键中有连字符。我需要用下划线替换那些带有连字符的键,并将其转换回json以便进行后续处理。我查看了JsonGenerator.Options文档,但找不到针对此特定需求的任何文档。
我还查看了遍历从JsonSlurper生成的映射的选项,但不幸的是,我无法找到一个有效的解决方案来遍历嵌套的映射,更改键并生成另一个可以转换为Json字符串的映射。
示例代码
import groovy.json.*
// This json can be nested many levels deep
def inputJson = """{
"database-servers": {
"dc-1": [
"server1",
"server2"
]
},
"discovery-servers": {
"dc-3": [
"discovery-server1",
"discovery-server2"
]
}
}
"""我需要将上面的代码转换为json,如下面的示例所示。我可以使用collectEntries方法进行迭代和转换,该方法只适用于第一层,但我需要递归地执行,因为输入json可以是多层深的嵌套。
{
"database_servers": {
"dc_1": [
"server1",
"server2"
]
},
"discovery_servers": {
"dc_3": [
"discovery-server1",
"discovery-server2"
]
}
}发布于 2019-01-22 06:37:33
看起来您只需要一个递归方法来处理slurped及其子Map。
import groovy.json.JsonSlurper
JsonSlurper slurper = new JsonSlurper()
def jsonmap = slurper.parseText( inputJson )
Map recurseMap( def inputMap ) {
return inputMap.collectEntries { key, val ->
String newkey = key.replace( "-", "_" )
if ( val instanceof Map ) {
return [ newkey, recurseMap( val ) ]
}
return [ newkey, val ]
}
}
def retmap = recurseMap( jsonmap )
println retmap // at this point you can use output this however you likehttps://stackoverflow.com/questions/54290331
复制相似问题