首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从深度嵌套映射中的键中删除连字符

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

Stack Overflow用户
提问于 2019-01-21 20:47:10
回答 1查看 63关注 0票数 0

我发了这个question in the Groovy mailing lists,但是我还没有得到回复。我想知道是否有人能帮上忙。我正在重新发布我的原始问题的相关文本。

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

我还查看了遍历从JsonSlurper生成的映射的选项,但不幸的是,我无法找到一个有效的解决方案来遍历嵌套的映射,更改键并生成另一个可以转换为Json字符串的映射。

示例代码

代码语言:javascript
复制
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可以是多层深的嵌套。

代码语言:javascript
复制
{
    "database_servers": {
        "dc_1": [
            "server1",
            "server2"
        ]
    },
    "discovery_servers": {
        "dc_3": [
            "discovery-server1",
            "discovery-server2"
        ]
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-22 06:37:33

看起来您只需要一个递归方法来处理slurped及其子Map。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54290331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档