删除深度嵌套映射中键的连字符



我在Groovy邮件列表中发布了这个问题,但我还没有得到答案。我想知道是否有人能在这里帮忙。我正在重新发布我原来问题的相关文本。

我有一个嵌套的输入json,通过JsonSlurper读取,其中一些键中有连字符。我需要用下划线替换那些带有连字符的键,并将其转换回json进行下游处理。我查看了JsonGenerator.Options文档,但找不到任何符合此特定要求的文档。

我还研究了迭代JsonSlurper生成的Map的选项,但不幸的是,我找不到一个有效的解决方案来迭代嵌套的Map,更改键并生成另一个可以转换为Json字符串的Map。

示例代码

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"
]
}
}

似乎只需要一个递归方法来处理模糊的Map及其子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 like

最新更新