我有以下数据:

{
   "storageSummary": "testvalue",
   "audit1": {
         "auditScore": 1,
         "suspensionScore": 1,
         "password" : "value1",
         "onlineScore": 0.99743587,
         "satelliteName": "us2.storj.io:7777"
      },
   "audit2": {
         "auditScore": 1,
         "suspensionScore": 1,
         "password" : "valueX",
         "onlineScore": 0.9992917,
         "satelliteName": "saltlake.tardigrade.io:7777"
      },
   "audit3": {
         "auditScore": 1,
         "suspensionScore": 1,
         "password" : "value72",
         "onlineScore": 0.99930555,
         "satelliteName": "ap1.storj.io:7777"
      }
}

在bash中,我需要判断这些数据,以更新所有auditX个对象的password.

我试过以下几种方法:

jq ' .[] |select(has("auditScore")) '

但我在第一项上得到了一个错误:

jq: error (at <stdin>:23): Cannot check whether string has a string key
exit status 5

当我删除数据中的第一个项"storageSummary": "testvalue"时,我可以遍历我的对象(但我的数据中有一些项没有auditscore个键……)

最终目标是在bash for循环中运行此结果以更新密码(并执行更具体的任务...)

你能给我指个方向吗?

编辑:谢谢PMF,是你让我继续前进.

现在,下一步(我应该打开一个新的线程吗?),我想做一些类似的事情:

DS_OBJECT=$(jq -c ' .[]|select(type == "object" and has("auditScore"))' ${DS_SRC_FILE})

for row in ${DS_OBJECT}; do
    _jq() {
     echo "${row}" | jq -r "${1}"
    }
    echo -e "Working $(_jq '.satelliteName')..."
    # then update $row's password...
done
  • 如何才能在循环中显示对象名称audit1而不是satelliteName
  • 如何更新此对象的密码?

谢谢

推荐答案

您可以使用select(type == "object")筛选对象,或使用相当于objects的快捷方式:

.[] | select(type == "object" and has("auditScore"))
# or
.[] | objects | select(has("auditScore"))

这将返回一个具有名为auditScore的字段的对象流

{
  "auditScore": 1,
  "suspensionScore": 1,
  "password": "value1",
  "onlineScore": 0.99743587,
  "satelliteName": "us2.storj.io:7777"
}
{
  "auditScore": 1,
  "suspensionScore": 1,
  "password": "valueX",
  "onlineScore": 0.9992917,
  "satelliteName": "saltlake.tardigrade.io:7777"
}
{
  "auditScore": 1,
  "suspensionScore": 1,
  "password": "value72",
  "onlineScore": 0.99930555,
  "satelliteName": "ap1.storj.io:7777"
}

要基于该流设置(Nother)字段,请将lhs放入括号中以保持上下文:

(.[] | select(type == "object" and has("auditScore"))).password = "X"
# or
(.[] | objects | select(has("auditScore"))).password = "X"

Json相关问答推荐

JOLT拉平数组

从先前的REST调用创建动态JSON主体

JSON字符串处理注入引号

由于无效的UTF-8开始字节0xa0,JSON被拒绝,但编码似乎有效

Postgres Select json数组并重新映射属性名称

来自json的可分析的构建报告

Spark-SQL中的from_unixtime函数未能给出正确的输出

Bicep脚本中如何设置弹性池的维护窗口?

匹配来自不同数组的值

Groovy JsonBuilder 在for循环中添加数组元素

使用杰克逊解析Kotlin 中的通用密封类

如何在 Android Studio 中将 List 字段作为空列表[]返回?

如何在 Node.js 中解析包含NaN的 JSON 字符串

使用绝对或相对路径在 curl 请求中发送 json 文件

ASP.NET MVC 读取原始 JSON 发布数据

如何访问 JSON 对象数组的第一个元素?

将循环 struct 转换为 JSON - 有什么方法可以找到它抱怨的字段?

PHP json_encode json_decode UTF-8

ASP.NET Web API JSON 输出中没有时间的日期

如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET?