使用Shell在jSON对象中动态添加键值对

时间:2018-10-24 08:53:01

标签: json shell jq keyvaluepair

我有一个名为version6json的json对象,如下所示

{
  "20007.098": {
    "os_version": "6.9",
    "kernel": "2.6.32-696",
    "sfdc-release": "2017.08"
  },
  "200907.09678”: {
    "os_version": "6.9",
    "kernel": "2.6.32-696",
    "sfdc-release": "201.7909"
  },
  "206727.1078”: {
    "os_version": "6.9",
    "kernel": "2.6.32-696.10.2.el6.x86_64",
    "sfdc-release": "20097.109”
  }
}

我想再添加一对键值对。键也是变量,值也是。 bundle_release =“ 2019.78”和value = {“ release”:“ 2018.1006”,“ kernel”:“ 2.6.32-754.3.5.el6.x86_64”,“ os”:“ 6.10”,“ current”:true}  现在,我希望将bundle_release作为键并将其值作为其值,因此新条目将为“ 2018.1006”:{“ release”:“ 2018.1006”,“ kernel”:“ 2.6.32-754.3.5.el6.x86_64”, “ os”:“ 6.10”,“ current”:true}

为此,我正在做以下事情

echo "$version6json" | jq --arg "$bundle_release" "$value" '. + {$bundle_release: "${value}"}'

将提供任何帮助。

P-S-根据峰的建议对问题进行编辑

2 个答案:

答案 0 :(得分:1)

首先,在使用变量的方式指定键名时,必须将变量括在括号中,这样您就可以:

 {($bundle_release): ...}

接下来,jq变量与shell变量不同,应在不引用它们且不使用bash-ism的情况下指定它们。

第三,在设置名为value的shell变量的值时,您必须适当地引用该表达式。

第四,为简化起见,请对--argjson使用$value

第五,示例JSON不太正确。修复后,以下将在bash或类似bash的环境中工作(假设您使用的是支持--argjson的jq版本):

bundle_release="1034,567"
value='{"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true}'

jq --arg b "$bundle_release" --argjson v "$value"  '
  . + {($b): $v}' <<< "$version6json"

答案 1 :(得分:1)

您没有为--arg选项提供足够的参数:手册中:

  

--arg name value

     
    

此选项将值作为预定义变量传递给jq程序。如果使用--arg foo bar运行jq,则             $foo在程序中可用,其值为"bar"。请注意,值将被视为字符串,因此             --arg foo 123会将$foo绑定到"123"