遍历JSON并在键存在时检索集

oaxa6hgo  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(70)

我有以下数据:

{
   "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循环中运行此结果以更新密码(并执行更具体的任务)。
你能告诉我正确的方向吗?

66bbxpm5

66bbxpm51#

您可以使用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"
}

要基于该流设置(另一个)字段,请将LHS Package 到括号中以保留上下文:

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

hfsqlsce2#

关于Ruby:

ruby -r json -e '
JSON.parse($<.read).select{|k,v| v.is_a?(Hash) && v.has_key?("auditScore")}.
    each{|k,v| puts "Key: #{k} \nValue: #{v}\n" }
' file

图纸:

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

如果要更改每个的密码:

ruby -r json -e '
puts JSON.pretty_generate(JSON.parse($<.read).
    each{|k,v| if v.is_a?(Hash) && v.has_key?("auditScore") 
    then
        v["password"]="XXX"
    end
})
' file

图纸:

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

相关问题