首页 > 解决方案 > 将 Python 转换为 Groovy - 嵌套 JSON

问题描述

我正在使用 Nextflow 实施工作流程。Nextflow 使用 groovy 作为它的基础语言,然后每个进程可以独立使用任何编程语言。我本质上是一名 Python 程序员,所以我编写的代码是用 Python 编写的。并且在转换语言时遇到了一些麻烦。

data = {
    "a" : "A",
    "b" : "B",
    "c" : {
        "somename":{
            "z" : "Z",
            "y" : "Y",
            "params" :{
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            }
        },

        "somename2":{
            "z" : "Z",
            "y" : "Y",
            "params" :{
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            }
        }
    }
}

CNS_PARAM_LIST = []
my_dict = {}

for each in data["c"]:
    for k, v in data["c"][each].get('params', {}).items():
        CNS_PARAM_LIST.extend([k, str(v)])
    my_dict[each] = CNS_PARAM_LIST

print(my_dict)

基本上,我有一个 JSON(数据),我需要从一些嵌套字段中创建一个字典。上述代码的输出是:

{'somename': ['minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500', 'minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500'], 'somename2': ['minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500', 'minimum', '3000', 'ignore', '60', 'maximum_A', '2500', 'maximum_B', '500']}

简单地说,制作somenamesomename2键,并制作params值。

任何 groovy 编码器都可以在 1/100 的时间内破解它?我相信还有一些方法可以使这段代码更高效,欢迎任何想法!

标签: pythonjsondictionarygroovy

解决方案


我猜你只是在每个 somename 的重复键时拼写错误

groovy 中的第一个差异是如何声明地图(python 中的字典)

my_dict = [:]

有关 groovy 集合的更多信息,您可以在此处找到:http ://docs.groovy-lang.org/next/html/documentation/working-with-collections.html

您的案例的代码:

def data = [
    "a" : "A",
    "b" : "B",
    "c" : [
        "somename":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            ]
        ],

        "somename2":[
            "z" : "Z",
            "y" : "Y",
            "params" :[
                "minimum": "3000",
                "ignore": "60",
                "maximum_A": "2500",
                "maximum_B": "500"
            ]
        ]
    ]
]
def my_dict = data.c.collectEntries{k,v-> [k,v.params]  }

println my_dict
//if you want to print it as json:
println groovy.json.JsonOutput.toJson(my_dict)

我在 Map 对象上使用collectEntries方法

您可以在 GDK 文档中找到其他 Map 方法:groovy Map just google gdk map

只要 groovy Map 扩展 java Map 检查 javadoc 中的主要方法:java Map


推荐阅读