【问题标题】:Change value of an object in JSON based on another key value - shell根据另一个键值更改 JSON 中对象的值 - shell
【发布时间】:2020-04-16 13:54:43
【问题描述】:

在 shell 中我有以下对象

[
{
  "ParameterKey":"a",
  "ParameterValue":"1"
},
{
  "ParameterKey":"b",
  "ParameterValue":"2"
},
{
  "ParameterKey":"c",
  "ParameterValue":"3"
},
{
  "ParameterKey":"d",
  "ParameterValue":"4"
}
]

我需要了解如何以最佳方式(不使用数组索引)访问 ParameterKeys 'b' 和 'd',例如jq 以便生成的数组为:

[
{
  "ParameterKey":"a",
  "ParameterValue":"1"
},
{
  "ParameterKey":"b",
  "ParameterValue":"5"
},
{
  "ParameterKey":"c",
  "ParameterValue":"3"
},
{
  "ParameterKey":"d",
  "ParameterValue":"6"
}
]

【问题讨论】:

  • 感谢 -1,需要解释一下吗?
  • 我没有给你-1,但可能是因为你没有展示你尝试过的东西。另外,对 ["b", 5] 和 ["d", 6] 来自哪里?请参阅minimal reproducible example 获取指导。
  • 我不禁认为这是非常挑剔的,因为很明显问题是什么以及如何回答它(由接受的答案证明)

标签: shell jq


【解决方案1】:

这将更改 ParameterName 的单个 ParameterValue

jq '[.[] | select(.ParameterKey == "b") .ParameterValue |= "5"]'

[
  {
    "ParameterKey": "a",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "b",
    "ParameterValue": "5"
  },
  {
    "ParameterKey": "c",
    "ParameterValue": "3"
  },
  {
    "ParameterKey": "d",
    "ParameterValue": "4"
  }
]

Try it online!

如果您不想硬编码键和值,可以使用--arg

jq --arg key "b" --arg value "5" '[.[] | select(.ParameterKey == $key) .ParameterValue |= $value]' </tmp/data.json

[
  {
    "ParameterKey": "a",
    "ParameterValue": "1"
  },
  {
    "ParameterKey": "b",
    "ParameterValue": "5"
  },
  {
    "ParameterKey": "c",
    "ParameterValue": "3"
  },
  {
    "ParameterKey": "d",
    "ParameterValue": "4"
  }
]

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    不清楚你在问什么,但以下 jq 过滤器解决了对问题的一种解释:

    map(if .ParameterKey == "b" then .ParameterValue = "5"
        elif .ParameterKey == "d" then .ParameterValue = "6"
        else . end)
    

    这是一种替代方法,使用单个 JSON 对象来定义定义更新的键/值对:

    map( {(.ParameterKey): .ParameterValue} )
    | add + {b:"5", d:"6"}
    | to_entries
    | map( {ParameterKey: .key, ParameterValue: .value} )
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-03
      • 2021-07-12
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多