首页 > 解决方案 > jq:通过 shell 变量附加 JSON 对象

问题描述

我有一个 JSON 文件,我正在尝试向其中添加另一个字段。

示例 JSON 文件

{"data":{}}

查看其他答案+=似乎有效:

objectName="objName"
cat $jsonFile | jq --arg objName $objectName '.data[$objName] += {"test": "json"}'

输出

{
  "data": {
    "objName": {
      "test": "json"
    }
  }
}

正如预期的那样。

问题是我无法对 JSON 进行硬编码,因此我将字符串作为变量输入。但我无法让语法起作用:

objectName="objName"
objJSON='{"test": "json"}'
cat $jsonFile | jq -r --arg objName $objectName --arg jsonString $objJSON '.data[$objName] += $jsonString'

我收到错误jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1: "json"}

标签: macosshellzshjq

解决方案


  1. 在传递 JSON 而不是字符串时使用--argjson而不是。--arg

  2. 如有疑问,请引用您的字符串;这样,如果执行代码的 shell 不是你认为的那个,你的值就不会被修改。(保持编写可移植代码所必需的习惯也很有帮助;我在 2000 年代中期花了 6 个月学习 zsh 后放弃了 zsh 的全部原因是我为其他 shell 编写时的代码质量受到了影响)。


objName="objName"
objJSON='{"test": "json"}'
echo '{"data":{}}' |
  jq --arg     objectName "$objName" \
     --argjson jsonString "$objJSON" \
    '.data[$objectName] += $jsonString'

...正确发出:

{
  "data": {
    "objName": {
      "test": "json"
    }
  }
}

推荐阅读