从深度嵌套的地图中的键中删除连字符

时间:2019-01-21 12:47:10

标签: groovy

我发布了此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"
        ]
    }
}

1 个答案:

答案 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