groovy - 在 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 脚本。然后输入将被输入以产生预期的输出。
解决方案
您可以在 处拆分映射 json 的键和值,.
并遍历结果列表以收集值/创建输出结构。
以下是基于您的示例代码。
请注意,我已将您的映射固定为大写,其中您的输入为大写和nitrogen-di-oxide
from CO
to 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"
}
}
}
推荐阅读
- python - Ansible/molecule:服务 docker 守护进程/引擎不会启动
- arrays - 从命令行读取值到数组
- html - 为什么在引导程序中我的手风琴菜单旁边有一个空矩形?
- c++ - 如何在 Qt 中调整像素图的大小?
- python - 如何使用 python difflib 将 json 对象与多个字段进行比较
- java - 如何使用 Java Singleton Class 启动 Quartz.Schedulejob?
- c# - 使用 Distinct() 过滤 Linq 中的重复记录
- wordpress - 您可以在 wp_query 中将 tax_query 与多种帖子类型一起使用吗?
- c++ - 更改程序中的访问说明符可以更改程序的行为吗?
- python - PyQt关闭子窗口问题,无限循环?