使用shell脚本创建嵌套的json文件

时间:2019-12-11 12:30:02

标签: json bash shell jq

有什么方法可以在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

2 个答案:

答案 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"

即它将空白中的每个变量分割开,并为从其创建的哈希值添加键。