我发布了此question in the Groovy mailing lists,但尚未得到答案。我想知道是否有人可以在这里提供帮助。我正在重新发布原始问题中的相关文本。
我有一个嵌套的输入json,可以通过JsonSlurper读取,其中一些键中带有连字符。我需要用下划线替换那些带有连字符的键,并将其转换回json以进行下游处理。我查看了JsonGenerator.Options文档,但找不到此特定要求的任何文档。
我还研究了通过JsonSlurper生成的Map进行迭代的选项,但是不幸的是,我无法找到一种有效的方法来迭代嵌套的Map,更改键并生成另一个可以转换为Map的Map一个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"
]
}
}
答案 0 :(得分:0)
似乎您只需要一个递归方法即可处理经过绘制的地图及其子地图。
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