如何用jq向已有JSON文件添加带引号的键值对?
解决在JSON的ressummary节点添加带引号数组Check字段的jq方案
示例现有JSON结构
假设你的key.json初始结构如下:
{ "ressummary": { "total": 100, "pass": 95 }, "metadata": "sample" }
需求目标
在ressummary节点下添加Check字段,其值为元素带双引号的数组,最终效果如下:
{ "ressummary": { "total": 100, "pass": 95, "Check": ["\"disk_ok\"", "\"memory_normal\"", "\"network_stable\""] }, "metadata": "sample" }
正确的jq命令实现
方式1:使用临时文件实现原地修改
适用于所有jq版本,无需额外工具:
jq '.ressummary.Check = ["\"disk_ok\"", "\"memory_normal\"", "\"network_stable\""]' key.json > temp.json && mv temp.json key.json
方式2:用sponge工具简化原地修改
如果系统安装了moreutils包(可通过apt install moreutils或brew install moreutils安装),可以避免临时文件:
jq '.ressummary.Check = ["\"disk_ok\"", "\"memory_normal\"", "\"network_stable\""]' key.json | sponge key.json
错误原因解析
你之前遇到的jq编译错误,大多是因为引号转义处理不当:
- 直接在shell中写未转义的嵌套双引号(比如
[""disk_ok""])会被shell解析为语法错误 - jq内部要生成带双引号的字符串,必须用
\"转义双引号
补充:若仅需普通字符串数组(元素不带额外引号)
如果你的需求是数组元素为普通字符串(而非带引号的字符串),直接去掉内部转义即可:
jq '.ressummary.Check = ["disk_ok", "memory_normal", "network_stable"]' key.json
内容的提问来源于stack exchange,提问作者Aditi
相关产品推荐
相关产品推荐

