有什么方法可以在bash中创建嵌套的json。
{
"t1": {
"k1": "v1",
"k2": "v2"
},
"t2": {
"k1": "v1",
"k2": "v2"
}
}
我有2个变量,这些变量具有用空格分隔的值。
var1="aa bb cc dd" -- which gives t1,t2 etc in the sample json
var2="ee ff gg hh" -- which gives k1,k2 etc in the sample json
在迭代变量时,我应该在json中导出t,k和v的值。下面是我想拥有的循环。但是可以根据建议进行更改。
for i in var1;
do
-----
-----
for j in var2;
do
-----
'json creation'
done
done
答案 0 :(得分:1)
这是唯一的解决方案。注意,所有迭代都可以在jq程序本身中完成:
jq -n --arg var1 "$var1" --arg var2 "$var2" '
[$var2|splits(" *")] as $v2
| (reduce range(0; $v2|length) as $i ({};
. + { ($v2[$i]): "v\($i + 1)" })) as $o
| reduce ($var1|splits(" *")) as $v1 ({};
setpath([$v1]; $o) )
'
使用:
var1="t1 t2"
var2="k1 k2"
输出将如Q所示,即:
{
"t1": {
"k1": "v1",
"k2": "v2"
},
"t2": {
"k1": "v1",
"k2": "v2"
}
}
答案 1 :(得分:-1)
这可以帮助您入门。它使用jq
,但我对它还不够熟悉,因此可能会有更简单的方法来实现您的目标。
#!/bin/bash
v1='k1 v1 k2 v2 double "'
jq -n "$(while : ; do
k=${v1%% *}
v1=${v1#* }
v=${v1%% *}
v1=${v1#* }
jq --arg k "$k" --arg v "$v" -n '{($k): $v}'
[[ $v1 == *' '* ]] || break
printf +
done)"
如图所示,即使变量包含双引号也可以使用。
使用具有JSON支持的高级语言似乎容易得多:
perl -MJSON -le 'print encode_json({@ARGV})' $v1
对于更多的变量,它变得更加毛茸茸:
perl -MJSON -le 'print encode_json(
{map +("t" . ++$i, {split}), @ARGV}
)' -- "$v1" "$v2"
即它将空白中的每个变量分割开,并为从其创建的哈希值添加键。