В Groovy скрипт, как построить динамически разобрать и собрать JSON - PullRequest
0 голосов
/ 20 сентября 2019

Предполагая, что у меня есть входная и выходная полезная нагрузка json, как это.

{
  "env": {
    "CO2": "2",
    "NO2": "3"
  }
}

output:

{
  "payload": {
    "Environment": {
      "carbon-di-oxide": "2",
      "nitrogen-di-oxide": "3"
    }
  }
}

Предположим, что json сопоставления:

{
  "mapping": {
    "payload.Environment.carbon-di-oxide": "env.co2",
    "payload.Environment.nitrogen-di-oxide": "env.co"
  }
}

Итак, на основе сопоставления JSON, как я могу создать динамический JSON.Я написал сценарий, подобный следующему:

import groovy.json.*;

def input='{\"env\": {\"CO2\": \"2\",\"NO2\": \"3\"}}';
def jsonSlurper = new JsonSlurper();
def finalJson = jsonSlurper.parseText('{}') ;
def inputJson= jsonSlurper.parseText(input) ;
finalJson["carbon-di-oxide"]=inputJson.env.CO2;
finalJson["nitrogen-di-oxide"]=inputJson.env.NO2;
def content=new JsonBuilder( finalJson).toPrettyString();
println("content-->"+content)

, но здесь, как я могу динамически передавать вложенный вывод, например payload.Environment.carbon-di-oxide, и создавать выходные данные на основе сопоставления json, как в javascript.Сначала будет создан скрипт groovy, основанный на отображении json.Затем на вход поступит ожидаемый результат.

1 Ответ

2 голосов
/ 20 сентября 2019

Вы можете разделить ключи и значения вашего сопоставления json на . и просмотреть полученные списки для сбора значений / создания структуры вывода.

Ниже приведен пример кода.
Обратите внимание , что я зафиксировал ваше отображение в верхнем регистре, где ваш ввод - в верхнем регистре, и nitrogen-di-oxide с CO до NO2.

import groovy.json.*;

def mappingInput = """
{
  "mapping": {
    "payload.Environment.carbon-di-oxide": "env.CO2",
    "payload.Environment.nitrogen-di-oxide": "env.NO2"
  }
}
"""
def input='{\"env\": {\"CO2\": \"2\",\"NO2\": \"3\"}}';
def jsonSlurper = new JsonSlurper();
def inputJson= jsonSlurper.parseText(input) ;
def mapping = jsonSlurper.parseText(mappingInput)

def output = [:]
mapping.mapping.each{k,v ->
    def inVal = inputJson
    v.split(/\./).each{inKey->
        inVal = inVal[inKey]
    }
    def keyParts = k.split(/\./)
    def current = output
    if (keyParts.size() > 1) {
        keyParts[0..-2].each{outKey ->
            if (!current.keySet().contains(outKey)) {
                current[outKey] = [:]
            }
            current = current[outKey]
        }
    }
    current[keyParts[-1]] = inVal
}
def finalJson = new JsonBuilder(output).toPrettyString()

println finalJson

Вывод будет

{
    "payload": {
        "Environment": {
            "carbon-di-oxide": "2",
            "nitrogen-di-oxide": "3"
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...