这是输入json
{
"step": 1,
"inputs": {
"first_input": {
"file_id": "xxx"
}
"second_input": 3
}
}
{
"step": 2,
"inputs": {
"my_first_arg": {
"file_id": "yyy"
}
"my_second_arg": 0
}
}
所需的csv文件是
1,first_input,"xxx"
1,second_input,3
2,my_first_arg:"yyy"
2,my_second_arg,0
这里的挑战是每个inputs
字段都包含一个具有不同键名和值类型的字典。基本上,我想要step
字段的值,inputs
的所有键以及inputs
的值的子节点,但要让相关数据保留在csv的同一行中。 / p>
答案 0 :(得分:2)
要生成所需值的数组:
.step as $step
| .inputs
| to_entries[]
| .key as $key
| [$step, .key]
+ (.value | if type=="object" then to_entries[] | [.key, .value] else [$key, .] end)
最后加上@csv
会产生CSV值,且数字未加引号。
使用-r命令行选项并对样本输入进行较小的校正将产生:
1,"first_input","file_id","xxx"
1,"second_input","second_input",3
2,"my_first_arg","file_id","yyy"
2,"my_second_arg","my_second_arg",0
如果您确实希望输出如Q所示,请在需要的地方有条件地加上引号("\""
),并使用join(",")
代替@csv
。
答案 1 :(得分:1)
考虑使用python及其json模块来解析json,那么您可以做几乎所有您想做的事情。这是一个几乎可以满足您需要的示例。因此,我想说的是,完全按照您想要的方式吐出它,将其更改为从文件加载json,将csv输出从StringIO更改为实际文件,就可以完成工作。
import json, csv, io
json_str = '[{"step":1,"inputs":{"first_input":{"file_id":"xxx"},"second_input":3}},{"step":2,"inputs":{"my_first_arg":{"file_id":"yyy"},"my_second_arg":0}}]'
def value(jsn):
if not isinstance(jsn, dict):
return jsn
return next(iter(jsn))
jsndata = json.loads(json_str)
csvdata = io.StringIO()
csvwriter = csv.writer(csvdata)
for i in jsndata:
step = i['step']
for key in i['inputs']:
val = value(i['inputs'][key])
csvwriter.writerow([step, key, val]);
print(csvdata.getvalue())