使用bash shell从json对象中的数组转换值

时间:2018-02-26 15:04:25

标签: bash shell unix echo jq

我完全是shell的新手......让我说出正确的用例。 使用案例: - 我在我的shell脚本中编写了两个get方法,当用户调用该脚本时,我将使用for循环对许多id执行一些操作。如下所示

test_get1(){

value1=//performing some operation and storing it
value2=//performing some operation and storing it

//below line I am converting the o/p of value1 and value2 in json

value=$JQ_TOOL -n --arg key1 "$value1" --arg key2 "$value2" '{"key1":"\($value1)","key2":"\($value2)"}'

}

test_get2(){
arr=(1,2,3)
local arr_values=()
for value in arr
do 
// Calling test_get1 for each iteraion of this loop, like below
val=$(test_get1 $value)
//below line will store the values in array
arr_values+=("$val")
done 
}

当我为上面的arr_values做回声时,我得到以下输出 输出

arr_values={
    "key1":"value1",
    "key2":"value2"
    }
    {
    "key1":"value1",
    "key2":"value2"
    }

我想以json格式转换上面的值,如下所示。

json_value=[
{
"key1":"value1",
"key2":"value2"
},
{
"key1":"value1",
"key2":"value2"
}
]

我尝试用JQ做,但无法得到正确的结果。

2 个答案:

答案 0 :(得分:1)

使用slurp选项:

jq -s . in.json > out.json

<强> in.json

{
  "key1": "value1",
  "key2": "value2"
}
{
  "key1": "value1",
  "key2": "value2"
}

<强> out.json

[
  {
    "key1": "value1",
    "key2": "value2"
  }
]
[
  {
    "key1": "value1",
    "key2": "value2"
  }
]

答案 1 :(得分:1)

1)您现有的“value =”行可以简化为:

value=$(jq -n --arg key1 "$value1" --arg key2 "$value2" '\
   {key1: $value1, key2: $value2}')

因为--arg总是将提供的值解释为字符串,并且因为jq表达式不需要遵循JSON的所有规则。

2)从您的脚本中,arr_value是一个JSON值的bash数组。要将其转换为JSON数组,您应该能够使用咒语,例如:

for r in "${a[@]}" ; do printf "%s" "$r" ; done | jq -s .

3)几乎肯定有更好的方法来实现你的最终目标。如果你只考虑一次调用jq,也许会有所帮助。