我的文件中有以下数据集:
{
"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/