Удалить дефисы из ключей на глубоко вложенной карте - PullRequest
0 голосов
/ 21 января 2019

Я разместил этот вопрос в списках рассылки Groovy , но пока не получил ответа. Мне было интересно, если кто-то может помочь здесь. Я повторно публикую соответствующий текст из моего исходного вопроса.

У меня есть вложенный 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"
        ]
    }
}

1 Ответ

0 голосов
/ 22 января 2019

Похоже, вам нужен рекурсивный метод для обработки наклонной Карты и ее вложенных Карт.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...