首页 > 解决方案 > 在 groovy 脚本中如何构建动态解析和构建 JSON

问题描述

假设我有这样的 json 输入和输出有效负载。

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

输出:

{
  "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动态地传递嵌套输出,并像在javascript中一样基于映射json创建输出。首先将根据映射 json 生成 groovy 脚本。然后输入将被输入以产生预期的输出。

标签: groovy

解决方案


您可以在 处拆分映射 json 的键和值,.并遍历结果列表以收集值/创建输出结构。

以下是基于您的示例代码。
请注意,我已将您的映射固定为大写,其中您的输入为大写和nitrogen-di-oxidefrom COto 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"
        }
    }
}

推荐阅读