macos - 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"}
解决方案
在传递 JSON 而不是字符串时使用
--argjson
而不是。--arg
如有疑问,请引用您的字符串;这样,如果执行代码的 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"
}
}
}
推荐阅读
- python - 尝试使用 python 连接到 azure cosmos 客户端,出现 104 连接中止错误
- amazon-web-services - 从 s3 到 athena 的 Aws Vpc 流日志
- c# - Json.NET 不尊重 PreserveReferencesHandling 反序列化
- tree - 二叉树中的最大和 BST
- java - GridLayout 超出了它的大小
- c++ - 使用迭代器作为参数为 lambda 函数创建打包任务
- sql - 是否有一个 sql 脚本来获取运行查询的日期和时间?
- angular - 如何以角度读取上传文件的内容?
- pandas - 如何在大熊猫中获得每年总计和每年不同观察类型的比例
- reactjs - 将 React 应用程序部署到 Firebase 后出现 Git 错误