json - jq : update json content when path is variable

标签 json bash jq

我的文件中有以下数据集:

{
   "storageSummary": 6.8624392E13,
   "audit1": {
         "auditScore": 1,
         "suspensionScore": 1,
         "onlineScore": 0.99743587,
         "satelliteName": "us2.storj.io:7777"
      },
   "audit2": {
         "auditScore": 1,
         "suspensionScore": 1,
         "onlineScore": 0.9992917,
         "satelliteName": "saltlake.tardigrade.io:7777"
      },
   "audit3": {
         "auditScore": 1,
         "suspensionScore": 1,
         "onlineScore": 0.99930555,
         "satelliteName": "ap1.storj.io:7777"
      }
}

我想更新内容(我将 json 存储到一个变量中,因为我进行了多次更新,然后我将创建一个新文件),但要更新的数据的路径是可变的:

例如,我有:

DS_SRC_FILE="test.json"

DS_OBJECT=$(jq -c '' ${DS_SRC_FILE})

ds="audit1"
new_name="toto"

jq --arg ds ${ds} --arg name ${new_name} '.[]|select(.value==$ds)|=(.satellitename = $name)' <<< ${DS_OBJECT}

所以,当然,这会失败,并出现解析错误:第 2 行第 36 列的数字文字无效

请问正确的方法是什么?

最佳答案

JSON 不使用单引号。请改用双引号,或将数字不加引号。

该命令仍然会失败:以 .[] 开头将丢弃对象的键并返回值,因此您无法再访问“audit1”。

此外,要更改值,您可以使用普通的 = (并且不使用 select),因为右侧对上下文不敏感:

jq --arg ds "$ds" --arg name "$new_name" '.[$ds]["satelliteName"] = $name' <<< "$DS_OBJECT"

另请注意,我对 shell 变量进行了双引号,即使它们包含空格,这也应该使命令正常工作。

关于json - jq : update json content when path is variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76273403/

相关文章:

ruby 1.9.3 为什么 JSON.generate(h) 抛出 UndefinedConversionError 错误,但 h.to_json 不会

bash - 引用与执行脚本相关的文件

linux - 什么(: ${foo%%bar}) mean in unix shell

ruby - rvm 不是函数,因为 gnome 终端将 bash 作为非登录 shell 运行?

jq 在应该抛出错误时接受无效的 json 输入

arrays - 尝试访问元素时路径表达式无效

javascript - 如何在 JavaScript 中重构 JSON?

java - 如何达到其他级别深度的 json 值?

使用模式列表的 python jsonschema 验证

json - 将 UNIX 环境输出为 JSON