将Python转换为Groovy-嵌套JSON

时间:2019-10-16 13:42:42

标签: python json dictionary groovy

我正在使用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值。

任何可以在1/100时间内破解此问题的Groovy编码器吗?我敢肯定,还有一些方法可以使此代码更高效,欢迎任何想法!

1 个答案:

答案 0 :(得分:1)

我猜你只是每个名字重复的键时拼错了

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只是Google gdk map

只要Groovy Map扩展了Java Map,请检查javadoc中的主要方法:java Map