通过Nextflow值通道读写JSON文件时生成无效JSON的问题
问题描述
我有一个为流水线提供参数的JSON文件,通过以下Groovy工具类方法解析和输出参数:
class PipelineParameters { // 解析JSON参数文件 public static Map readParams(json_file) { def jsonSlurper = new groovy.json.JsonSlurper() String pipelineparameter = new File(json_file).text def Map configparam = (Map) jsonSlurper.parseText(pipelineparameter) return configparam } // 将Map写入JSON文件 public static void writeParams(params, filename) { def json = new groovy.json.JsonBuilder(params) def myFile = new File(filename) myFile.write(groovy.json.JsonOutput.prettyPrint(json.toString())) } }
读取参数后,我通过值通道将其传递给流程:
parameters = PipelineParameters.readParams(params.pipeline_params) DoSomething(Channel.fromPath(file), Channel.value(parameters))
流水线结束后部分参数可能已修改,我尝试使用writeParams函数输出新参数,但调用PipelineParameters.writeParams(parameters.toString(), 'params.json')生成了无效JSON,示例如下:
{data=foo, ncores=40}
该JSON缺少合法引号,无法被其他JSON解析器识别,请问我哪里操作出错了?
问题原因与解决方法
错误原因
你调用writeParams时传入了parameters.toString(),这会把原本的Map对象转换成Groovy默认格式的字符串(键值用=连接,无引号)。JsonBuilder接收这个字符串后,会将其作为单一字符串值处理,最终生成的内容自然不符合标准JSON格式。
解决方法
直接传入parameters这个Map对象即可,无需调用toString()。正确的调用代码如下:
PipelineParameters.writeParams(parameters, 'params.json')
这样JsonBuilder会正确遍历Map的键值对,自动添加合法引号,生成标准的JSON文件。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

